另外一个强大的布局排版类,QGraphicsGridLayout 提供在Graphic view 中对widget 进行格子布局管理的功能。
通常用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]
- 布局的风格数据缓存:
- 布局的区域大小缓存:
- 布局的伸展方向缓存:
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垂直方向的间隔