QLayout布局类

2024-04-26  本文已影响0人  Alliawell

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:3

QFormLayout类

QFormLayout用来管理2列的输入表单,左边列通常是Label,右边列通常是输入框,如LineEdit,SpinBox等。

传统上,习惯使用2列的QGridLayout来管理表单,但QFormLayout提供了更高级的功能:

1)根据不同的OS平台自动调整外观。

2)可以wrap(换行)长的row,对小的显示器很友好。

3)API更友好,addRow()可以直接拿添加Label。

FormLayout的实例 Layou还可以调整各种布局的距离

参考

[1].Qt界面设计时使各控件依据窗口缩放进行自适应填充的方法——使用布局、Spacer等控件

上一篇 下一篇

猜你喜欢

热点阅读