Layout用来管理widgets,但是widgets的parent只能是widget,不能是layout。layout中所有widget的parent是layout的parentWidget()。
Qt帮助文档里的Layout Management详细介绍了各个layout的使用。(QSplitter不是layout,而是个widget)
QT中提供的布局器控件[1] 图1. 常用布局器的继承关系 图2. QSizePolicy的4个标志 图3. Layout的几种选项Layout对Widget的影响
Layout对其中的widget做如下处理:
1.所有的widgest都根据QWidget::sizePolicy()和QWidget::sizeHit()被分配空间。
2.如果widgets有非零的拉伸因子(stretch factor),他们会根据比例获得空间(看下一条)。
3.如果widgets的拉伸因子被设为0,则只有在其他widget不需要空间时才会获得更多空间。没有拉伸因子时,有Expanding属性的会优先获得更多空间。
4.Widget如果分配的空间小于minimum值(或minimum size hint如果没有指定最小值),则他们会分配到最小的值。minimum=0就是没有设置。(当设置的stretch factor来决定大小时,则不需要设置mini或mini hint.)
5.当widget分配的空间大于maximum szie,他们会被分配到maximum size(如果有stretch factor,则不需要有最大值)。
QLayout永远不会把widget的大小变得比minimumSizeHint小,除非设置了minimum size或size policy设为QSizePolicy::Ignore. 如果设置了minimum size,则minimum size hint自动被忽略。
总结:Layout先看拉伸因子,没有拉伸因子看expanding。大小先看minSize和maxSize,然后看minSizeHint。
QLayoutBox类
QLayoutBox占用从父Layout或parentWidget对象分得的空间,把空间分成若干个box,并让它内部的widget填满一个box(由于是填满,因此当Layout大小改变时,里面的widget的大小也会改变)。
图4. 默认填满Layout,有弹簧时则不变如果QBoxLayout不是顶层的layout(它没有管理widget的所有空间和子对象),在使用它之前,你必须添加它到其父layout,最常用的方法是调用parentLayout->addLayout()。
一个QBoxLayout如果没有父layout,则它必须有一个parentWidget,它的大小会随父对象缩放,其内部的widget也会随它缩放(因为要填满空间)。
Layout内部的widget都变成了其parentWidget()的子对象。
图4中最外层的QVBoxLayout有个隐含的parentWidget(通过*_ui.h代码可以看到),大小就是QVBoxLayout的大小,且不变。此时当整个窗口改变大小时,Layout的大小不变,因此其内部button的大小也不会变。
如果把layout的父对象设为整个窗口,则窗口大小变化时,layout内部的button就会跟随改变。
拉伸因子stretch很有用,可以设置各个box拉伸的比例,0就是不拉伸 HboxLayout的拉伸因子设为1:2:3QFormLayout类
QFormLayout用来管理2列的输入表单,左边列通常是Label,右边列通常是输入框,如LineEdit,SpinBox等。
传统上,习惯使用2列的QGridLayout来管理表单,但QFormLayout提供了更高级的功能:
1)根据不同的OS平台自动调整外观。
2)可以wrap(换行)长的row,对小的显示器很友好。
3)API更友好,addRow()可以直接拿添加Label。
FormLayout的实例 Layou还可以调整各种布局的距离参考
网友评论