UI布局引擎Layout 之 QGraphicsGridLayout

另外一个强大的布局排版类,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垂直方向的间隔

原文链接: https://www.cnblogs.com/JefferyZhou/archive/2012/09/24/2700341.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    UI布局引擎Layout 之 QGraphicsGridLayout

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/63650

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月9日 上午11:04
下一篇 2023年2月9日 上午11:05

相关推荐