📄 layout.cpp
字号:
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 + -