⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 layout.cpp

📁 Trolltech公司发布的基于C++图形开发环境
💻 CPP
📖 第 1 页 / 共 2 页
字号:
bool Grid::isWidgetEndCol( int c ) const{    int r;    for ( r = 0; r < nrows; r++ ) {	if ( cell( r, c ) && ((c == ncols-1) || (cell( r, c) != cell( r, c+1) )) )	    return TRUE;    }    return FALSE;}bool Grid::isWidgetStartRow( int r ) const{    int c;    for ( c = 0; c < ncols; c++ ) {	if ( cell( r, c ) && ( (r==0) || (cell( r, c) != cell( r-1, c) )) )	    return TRUE;    }    return FALSE;}bool Grid::isWidgetEndRow( int r ) const{    int c;    for ( c = 0; c < ncols; c++ ) {	if ( cell( r, c ) && ((r == nrows-1) || (cell( r, c) != cell( r+1, c) )) )	    return TRUE;    }    return FALSE;}bool Grid::isWidgetTopLeft( int r, int c ) const{    QWidget* w = cell( r, c );    if ( !w )	return FALSE;    return ( !r || cell( r-1, c) != w ) && (!c || cell( r, c-1) != w);}void Grid::extendLeft(){    int r,c,i;    for ( c = 1; c < ncols; c++ ) {	for ( r = 0; r < nrows; r++ ) {	    QWidget* w = cell( r, c );	    if ( !w )		continue;	    int cc = countCol( r, c);	    int stretch = 0;	    for ( i = c-1; i >= 0; i-- ) {		if ( cell( r, i ) )		    break;		if ( countCol( r, i ) < cc )		    break;		if ( isWidgetEndCol( i ) )		    break;		if ( isWidgetStartCol( i ) ) {		    stretch = c - i;		    break;		}	    }	    if ( stretch ) {		for ( i = 0; i < stretch; i++ )		    setCol( r, c-i-1, w, cc );	    }	}    }}void Grid::extendRight(){    int r,c,i;    for ( c = ncols - 2; c >= 0; c-- ) {	for ( r = 0; r < nrows; r++ ) {	    QWidget* w = cell( r, c );	    if ( !w )		continue;	    int cc = countCol( r, c);	    int stretch = 0;	    for ( i = c+1; i < ncols; i++ ) {		if ( cell( r, i ) )		    break;		if ( countCol( r, i ) < cc )		    break;		if ( isWidgetStartCol( i ) )		    break;		if ( isWidgetEndCol( i ) ) {		    stretch = i - c;		    break;		}	    }	    if ( stretch ) {		for ( i = 0; i < stretch; i++ )		    setCol( r, c+i+1, w, cc );	    }	}    }}void Grid::extendUp(){    int r,c,i;    for ( r = 1; r < nrows; r++ ) {	for ( c = 0; c < ncols; c++ ) {	    QWidget* w = cell( r, c );	    if ( !w )		continue;	    int cr = countRow( r, c);	    int stretch = 0;	    for ( i = r-1; i >= 0; i-- ) {		if ( cell( i, c ) )		    break;		if ( countRow( i, c ) < cr )		    break;		if ( isWidgetEndRow( i ) )		    break;		if ( isWidgetStartRow( i ) ) {		    stretch = r - i;		    break;		}	    }	    if ( stretch ) {		for ( i = 0; i < stretch; i++ )		    setRow( r-i-1, c, w, cr );	    }	}    }}void Grid::extendDown(){    int r,c,i;    for ( r = nrows - 2; r >= 0; r-- ) {	for ( c = 0; c < ncols; c++ ) {	    QWidget* w = cell( r, c );	    if ( !w )		continue;	    int cr = countRow( r, c);	    int stretch = 0;	    for ( i = r+1; i < nrows; i++ ) {		if ( cell( i, c ) )		    break;		if ( countRow( i, c ) < cr )		    break;		if ( isWidgetStartRow( i ) )		    break;		if ( isWidgetEndRow( i ) ) {		    stretch = i - r;		    break;		}	    }	    if ( stretch ) {		for ( i = 0; i < stretch; i++ )		    setRow( r+i+1, c, w, cr );	    }	}    }}void Grid::simplify(){    extendLeft();    extendRight();    extendUp();    extendDown();    merge();}void Grid::merge(){    int r,c;    for ( c = 0; c < ncols; c++ )	cols[c] = FALSE;	    for ( r = 0; r < nrows; r++ )	rows[r] = FALSE;    for ( c = 0; c < ncols; c++ ) {	for ( r = 0; r < nrows; r++ ) {	    if ( isWidgetTopLeft( r, c ) ) {		rows[r] = TRUE;		cols[c] = TRUE;	    }	}    }}bool Grid::locateWidget( QWidget* w, int& row, int& col, int& rowspan, int & colspan ){    int r,c, r2, c2;    for ( c = 0; c < ncols; c++ ) {	for ( r = 0; r < nrows; r++ ) {	    if ( cell( r, c ) == w  ) {		row = 0;		for ( r2 = 1; r2 <= r; r2++ ) {		    if ( rows[ r2-1 ] )			row++;		}		col = 0;		for ( c2 = 1; c2 <= c; c2++ ) {		    if ( cols[ c2-1 ] )			col++;		}		rowspan = 0;		for ( r2 = r ; r2 < nrows && cell( r2, c) == w; r2++ ) {		    if ( rows[ r2 ] )			rowspan++;		}		colspan = 0;		for ( c2 = c; c2 < ncols && cell( r, c2) == w; c2++ ) {		    if ( cols[ c2] )			colspan++;		}		return TRUE;	    }	}    }    return FALSE;}GridLayout::GridLayout( const QWidgetList &wl, QWidget *p, FormWindow *fw, QWidget *lb, const QSize &res, bool doSetup )    : Layout( wl, p, fw, lb, doSetup ), resolution( res ){    grid = 0;    if ( doSetup )	setup();}GridLayout::~GridLayout(){    delete grid;}void GridLayout::doLayout(){    bool needMove, needReparent;    if ( !prepareLayout( needMove, needReparent ) )	return;    QDesignerGridLayout *layout = (QDesignerGridLayout*)WidgetFactory::createLayout( layoutBase, 0, WidgetFactory::Grid );    if ( !grid )	buildGrid();    QWidget* w;    int r, c, rs, cs;    for ( w = widgets.first(); w; w = widgets.next() ) {	if ( grid->locateWidget( w, r, c, rs, cs) ) {	    if ( needReparent && w->parent() != layoutBase )		w->reparent( layoutBase, 0, QPoint( 0, 0 ), FALSE );	    if ( rs * cs == 1 ) {		layout->addWidget( w, r, c, w->inherits( "Spacer" ) ? ( (Spacer*)w )->alignment() : 0 );	    } else {		layout->addMultiCellWidget( w, r, r+rs-1, c, c+cs-1, w->inherits( "Spacer" ) ? ( (Spacer*)w )->alignment() : 0 );	    }	    w->show();	} else {	    qWarning("ooops, widget '%s' does not fit in layout", w->name() );	}    }    finishLayout( needMove, layout );}void GridLayout::setup(){    Layout::setup();    buildGrid();}void GridLayout::buildGrid(){    QWidget* w;    QRect br;    for ( w = widgets.first(); w; w = widgets.next() )	br = br.unite( w->geometry() );    delete grid;    grid = new Grid( br.height() / resolution.height() + 1,		     br.width() / resolution.width() + 1 );    int r,c;    for ( r = 0; r < grid->numRows(); r++ ) {	for ( c = 0; c < grid->numCols(); c++ ) {	    QPoint p( br.left() + c * resolution.width(),		      br.top() + r* resolution.height() );	    QRect cr( p, resolution );	    for ( w = widgets.first(); w; w = widgets.next() ) { 		    // check that the overlap is significant 		    QRect intersect = cr.intersect( w->geometry() ); 		    if ( intersect.size().width() > resolution.width()/2 && 			 intersect.size().height() > resolution.height()/2 ) { 			grid->setCell( r, c, w ); 		    }	    }	}    }    grid->simplify();}Spacer::Spacer( QWidget *parent, const char *name )    : QWidget( parent, name, WMouseNoMask ), orient( Vertical ){    setSizeType( Expanding );    setAutoMask( TRUE );    ar = TRUE;}void Spacer::paintEvent( QPaintEvent * ){    QPainter p( this );    p.setPen( Qt::blue );    if ( orient == Horizontal ) {	const int dist = 3;	const int amplitude = QMIN( 3, height() / 3 );	const int base = height() / 2;	int i = 0;	p.setPen( white );	for ( i = 0; i < width() / 3 +2; ++i )	    p.drawLine( i * dist, base - amplitude, i * dist + dist / 2, base + amplitude );	p.setPen( blue );	for ( i = 0; i < width() / 3 +2; ++i )	    p.drawLine( i * dist + dist / 2, base + amplitude, i * dist + dist, base - amplitude );	p.drawLine( 0, 0, 0, height() );	p.drawLine( width() - 1, 0, width() - 1, height());    } else {	const int dist = 3;	const int amplitude = QMIN( 3, width() / 3 );	const int base = width() / 2;	int i = 0;	p.setPen( white );	for ( i = 0; i < height() / 3 +2; ++i )	    p.drawLine( base - amplitude, i * dist, base + amplitude,i * dist + dist / 2 );	p.setPen( blue );	for ( i = 0; i < height() / 3 +2; ++i )	    p.drawLine( base + amplitude, i * dist + dist / 2, base - amplitude, i * dist + dist );	p.drawLine( 0, 0, width(), 0 );	p.drawLine( 0, height() - 1, width(), height() - 1 );    }}void Spacer::updateMask(){    QRegion r( rect() );    if ( orient == Horizontal ) {	const int amplitude = QMIN( 3, height() / 3 );	const int base = height() / 2;	r = r.subtract( QRect(1, 0, width() - 2, base - amplitude ) );	r = r.subtract( QRect(1, base + amplitude, width() - 2, height() - base - amplitude ) );    } else {	const int amplitude = QMIN( 3, width() / 3 );	const int base = width() / 2;	r = r.subtract( QRect(0, 1, base - amplitude, height() - 2 ) );	r = r.subtract( QRect( base + amplitude, 1, width() - base - amplitude, height() - 2 ) );    }    setMask( r );}void Spacer::setSizeType( SizeType t ){    QSizePolicy sizeP;    if ( orient == Vertical )	sizeP = QSizePolicy( QSizePolicy::Minimum, (QSizePolicy::SizeType)t );    else	sizeP = QSizePolicy( (QSizePolicy::SizeType)t, QSizePolicy::Minimum );    setSizePolicy( sizeP );}Spacer::SizeType Spacer::sizeType() const{    if ( orient == Vertical )	return (SizeType)sizePolicy().verData();    return (SizeType)sizePolicy().horData();}int Spacer::alignment() const{    if ( orient == Vertical )	return AlignHCenter;    return AlignVCenter;}QSize Spacer::minimumSize() const{    return QSize( 20, 20 );}QSize Spacer::sizeHint() const{    if ( parentWidget() && WidgetFactory::layoutType( parentWidget() ) != WidgetFactory::NoLayout &&	 ( sizeType() == Fixed || sizeType() == Maximum ) )	return size();    return QSize( 20, 20 );}Qt::Orientation Spacer::orientation() const{    return orient;}void Spacer::setOrientation( Qt::Orientation o ){    if ( orient == o ) 	return;	    SizeType st = sizeType();    orient = o;    setSizeType( st );    if ( ar )	resize( QSize( size().height(), size().width() ) );    updateMask();    update();    updateGeometry();}void QDesignerGridLayout::addWidget( QWidget *w, int row, int col, int align_ ){    items.insert( w, Item(row, col, 1, 1) );    QGridLayout::addWidget( w, row, col, align_ );}void QDesignerGridLayout::addMultiCellWidget( QWidget *w, int fromRow, int toRow,					      int fromCol, int toCol, int align_ ){    items.insert( w, Item(fromRow, fromCol, toRow - fromRow + 1, toCol - fromCol +1) );    QGridLayout::addMultiCellWidget( w, fromRow, toRow, fromCol, toCol, align_ );}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -