另外一个强大的布局排版类,QGraphicsGridLayout 提供在Graphic view 中对widget 进行格子布局管理的功能。

Image(131)

通常用parent=NULL的方式在堆上构建QGraphicsGridLayout (也就是 QGraphicsGridLayout * layout = newQGraphicsGridLayout (NULL) ),

然后通过调用接口addItem()的方式增加wdiget 和 sub layout,完成创建后,在设置layout的方向以及调用QGraphicsWidget::setLayout()接口对构建的layout进行绑定。在构造完成后,QGraphicsGridLayout 会自动计算出格子的维数,得到 row 和 column 。

和QGraphicsLinerLayout一样,gridlayout也是拥有add到layout的item的所有权,只是在一些特殊的情况下,当 item 是从QGraphicsItem(或者QGraphicsWidget)多层继承过来的,这个时候再item的所有权会出现混乱的现象,因为item这个时候属于两个所有权层次体系。参考QGraphicsLayoutItem::setOwnedBylayout()相关文档,确认所有权问题的处理方式。通过接口count()和itemAt()可以遍历item, 通过removeAt 和 removeItem() 可以移除 layout 里面的 item, 这个时候只是剥离item 和 layout 的所有权关系,但并不销毁相关item。

简称:

无特殊指定,layout 代表 grid layout

约定:

"当前item" "当前layout"   指上下文起作用的作用目标

名词解释:

cell : 单元格

rowSpan : 行间隔

column : 列间隔

alignment : 对齐方式


大小策略

QGraphicsGridLayout 尽量尊重每一个item自己的size hints 和 size policies, 当 表格当做的一个Cell 拥有在填充所在的item后有还有剩余空间,这个时候Cell会根据当前item设置的对齐方式排列item 。可以为每一个item设置对齐方式,也可以为整行或者整列设置对齐方式。

成员函数:

函数名:
说明:

void QGraphicsGridLayout::addItem ( QGraphicsLayoutItem * item, int row, int column, int rowSpan, int columnSpan, Qt::Alignment alignment = 0 )
在(row, column) 指定的单元格,增加一个item,同时可以指定单元格对应的rowSpan 和 columnSpan,还有一个可选参数,item 的 alignment

void QGraphicsGridLayout::addItem ( QGraphicsLayoutItem * item, int row, int column, Qt::Alignment alignment = 0 )
在(row, column) 指定的单元格,增加一个item,还有一个可选参数,item 的 alignment

Qt::Alignment QGraphicsGridLayout::alignment ( QGraphicsLayoutItem * item ) const
返回给定item的对齐方式

Qt::Alignment QGraphicsGridLayout::columnAlignment ( int column ) const
返回指定列的对齐方式

int QGraphicsGridLayout::columnCount () const
返回layout中的列数.
注意这里返回的列数总是比表格中最后一列的索引值大1 .
列数 =  最大索引值 + 1
跟C/C++中数组概念一致。
表格中空列也回计算在内,除非空列是最后一列

qreal QGraphicsGridLayout::columnMaximumWidth ( int column ) const
返回指定列的最大宽度

qreal QGraphicsGridLayout::columnMinimumWidth ( int column ) const
返回指定列的最小宽度

qreal QGraphicsGridLayout::columnPreferredWidth ( int column ) const
返回指定列的首选宽度

qreal QGraphicsGridLayout::columnSpacing ( int column ) const
返回指定列的间隔
注意这里的“列间隔”的语义,column的间隔是是指 column列与column+1列的间隔
后面的间隔语义与此相同

int QGraphicsGridLayout::columnStretchFactor ( int column ) const
返回指定列的伸展因子

int QGraphicsGridLayout::count () const [virtual]
重载实现 QGraphicsLayout::count().

qreal QGraphicsGridLayout::horizontalSpacing () const
返回layout的默认水平间隔

void QGraphicsGridLayout::invalidate () [virtual]
重载实现 QGraphicsLayout::invalidate().
注意:invalidate 不是布局的重载必须项,而这里GridLayout重载了这个函数,需要深入剖析一下
从代码可以看到,这个重载函数做了两件事情:

QGridLayoutEngine::invalidate()

QGraphicsLayout::invalidate()

所以比重载前多干了一件事情,也就是调用了布局引擎的invalidate(),深入布局引擎,可以看到invalidata 清空了四类缓存:

  • 布局的有效索引区段缓存:

int q_cachedEffectiveFirstRows[NOrientations]

q_cachedEffectiveLastRows[Norientations]

  • 布局的风格数据缓存:
QLayoutStyleInfo q_cachedDataForStyleInfo
  • 布局的区域大小缓存:
QSizeF q_cachedSize
  • 布局的伸展方向缓存:

quint8 q_cachedConstraintOrientation : 3

QGraphicsLayoutItem * QGraphicsGridLayout::itemAt ( int row, int column ) const
返回指定单元格 (row, column)的item

QGraphicsLayoutItem * QGraphicsGridLayout::itemAt ( int index ) const [virtual]
重载实现 QGraphicsLayout::itemAt().
返回指定单元格 index 的item , 不存在的时候返回NULL

void QGraphicsGridLayout::removeAt ( int index ) [virtual]
重载实现 QGraphicsLayout::removeAt().
在layout的层级树上移除 索引index的 item,并交回item的所有权给 移除的调用者

Qt::Alignment QGraphicsGridLayout::rowAlignment ( int row ) const
返回指定行(row)的对齐方式

int QGraphicsGridLayout::rowCount () const
返回layout中的行数,
返回语义和计算方式与columnCount()一致

qreal QGraphicsGridLayout::rowMaximumHeight ( int row ) const
返回指定行的最大高度

qreal QGraphicsGridLayout::rowMinimumHeight ( int row ) const
返回指定行的最小高度

qreal QGraphicsGridLayout::rowPreferredHeight ( int row ) const
返回指定行的首选高度

qreal QGraphicsGridLayout::rowSpacing ( int row ) const
返回指定行间隔

int QGraphicsGridLayout::rowStretchFactor ( int row ) const
返回指定行的伸展因子

void QGraphicsGridLayout::setAlignment ( QGraphicsLayoutItem * item, Qt::Alignment alignment )
设置指定item的对齐方式

void QGraphicsGridLayout::setColumnAlignment ( int column, Qt::Alignment alignment )
设置指定列的对齐方式

void QGraphicsGridLayout::setColumnFixedWidth ( int column, qreal width )
给列设置固定宽度

void QGraphicsGridLayout::setColumnMaximumWidth ( int column, qreal width )
设置列的最大宽度

void QGraphicsGridLayout::setColumnMinimumWidth ( int column, qreal width )
设置列的最小宽度

void QGraphicsGridLayout::setColumnPreferredWidth ( int column, qreal width )
设置列的首选宽度

void QGraphicsGridLayout::setColumnSpacing ( int column, qreal spacing )
设置列间隔

void QGraphicsGridLayout::setColumnStretchFactor ( int column, int stretch )
设置列伸展因子

void QGraphicsGridLayout::setGeometry ( const QRectF & rect ) [virtual]
重载 QGraphicsLayoutItem::setGeometry().
设置layout的几何区域为 rect 指定的区域

void QGraphicsGridLayout::setHorizontalSpacing ( qreal spacing )
设置布局的水平间隔

void QGraphicsGridLayout::setRowAlignment ( int row, Qt::Alignment alignment )
设置行的对齐方式

void QGraphicsGridLayout::setRowFixedHeight ( int row, qreal height )
设置行的固定高度

void QGraphicsGridLayout::setRowMaximumHeight ( int row, qreal height )
设置行的最大高度

void QGraphicsGridLayout::setRowMinimumHeight ( int row, qreal height )
设置行的最小高度

void QGraphicsGridLayout::setRowPreferredHeight ( int row, qreal height )
设置行的首选高度

void QGraphicsGridLayout::setRowSpacing ( int row, qreal spacing )
设置行间隔

void QGraphicsGridLayout::setRowStretchFactor ( int row, int stretch )
设置行的伸展因子

void QGraphicsGridLayout::setSpacing ( qreal spacing )
设置layout示意的默认间隔大小,同时设置水平和垂直间隔。

void QGraphicsGridLayout::setVerticalSpacing ( qreal spacing )
设置layout的垂直方向的间隔

QSizeF QGraphicsGridLayout::sizeHint ( Qt::SizeHint which, const QSizeF & constraint = QSizeF() ) const [virtual]
重载实现QGraphicsLayoutItem::sizeHint().

qreal QGraphicsGridLayout::verticalSpacing () const
返回layout垂直方向的间隔