Qt6.8的布局管理系统,用于自动排列部件:水平布局QHBoxLayout、垂直布局QVBoxLayout、网格布局QGridLayout、表单布局QFormLayout
布局(layout)是一种优雅而灵活的方式,可以在其容器内自动排列子部件 (child widgets)。每个部件通过sizeHint和sizePolicy属性向布局报告其尺寸要求,布局会相应地分配可用空间。
Qt布局系统(layout system)提供了一种简单而强大的方法,可以自动排列部件中的子部件,以确保它们充分利用可用空间。
Qt包含一组布局管理类,用于描述部件在应用程序用户界面中的布局方式 。当部件的可用空间发生变化时,这些布局会自动定位和调整部件的大小,以确保部件的排列一致,并确保整个用户界面保持可用。
所有QWidget子类都可以使用布局来管理其子项。QWidget::setLayout()函数将布局应用于部件。当以这种方式在部件上设置布局时,它将负责以下任务:
(1).子部件的定位
(2).合理的窗口默认大小
(3).合理的窗口最小大小
(4).调整大小处理
(5).内容更改时的自动更新:子部件的字体大小、文本或其它内容;隐藏或显示子部件;移除子部件
Qt的布局类专为手写C++代码而设计,允许以像素为单位指定测量值,从而简化了代码的理解和使用。使用Qt Widgets Designer创建的表单(form)生成的代码也使用了布局类。Qt Widgets Designer在尝试表单设计时非常有用,因为它避免了用户界面开发中通常涉及的编译、链接和运行周期。
为Widget提供良好布局的最简单方法是使用内置布局管理器:QHBoxLayout、QVBoxLayout、QGridLayout和QFormLayout。这些类继承自QLayout,而QLayout又派生自QObject(而非QWidget)。它们负责一组Widget的几何管理(geometry management)。要创建更复杂的布局,你可以将布局管理器嵌套使用。
(1).QHBoxLayout:将部件布置在水平行中,从左到右(对于从右到左的语言,则从右到左)。
(2).QVBoxLayout:将部件从上到下排列在垂直列中。
(3).QGridLayout:在二维网格中布局部件。部件可以占据多个单元格。
(4).QFormLayout:以2列描述性标签字段样式布置部件。
使用布局的技巧:
(1).使用布局时,构造子部件时无需传递父级。布局会自动重新设置部件的父级(使用QWidget::setParent()),使它们成为安装该布局的部件的子级。注意:布局中的部件是安装该布局的部件的子级,而不是布局本身的子级。部件只能以其他部件为父级,而不能以布局为父级。
(2).你可以使用addLayout()在布局上嵌套布局;内部布局将成为其所插入布局的子级。
将部件添加到布局时,布局过程如下:
(1).所有部件最初都会根据其QWidget::sizePolicy()和QWidget::sizeHint()分配一定大小的空间。
(2).如果任何部件设置的拉伸因子(stretch factor)大于零,则它们会根据拉伸因子的比例分配空间。
(3).如果任何部件设置的拉伸因子为零,则只有在没有其他部件需要空间的情况下,它们才会获得更多空间。其中,首先会将空间分配给采用扩展大小策略(Expanding size policy)的部件。
(4).任何分配空间小于其最小尺寸(如果未指定最小尺寸,则为最小尺寸提示(hint))的部件都会分配其所需的最小尺寸。(部件无需设置最小尺寸或最小尺寸提示,在这种情况下拉伸因子是其决定因素。)
(5).任何分配空间大于其最大尺寸的部件都会分配其所需的最大尺寸。(部件无需设置最大尺寸,在这种情况下拉伸因子是其决定因素。)
拉伸因子:Widget通常在创建时不设置任何拉伸因子。当它们在布局中布局时,会根据其QWidget::sizePolicy()或最小尺寸提示,以较大者为准分配相应的空间。拉伸因子用于更改Widget所占空间的比例。
布局中自定义Widget:
(1).创建自己的Widget类时,还应该传递其布局属性。如果Widget使用了Qt布局中的一个,则布局属性已处理完毕。如果Widget没有任何子Widget,或者使用手动布局,则可以使用以下任何或所有机制更改Widget的行为:
重新实现QWidget::sizeHint()以返回Widget的首选大小。
重新实现QWidget::minimumSizeHint()以返回Widget可以拥有的最小大小。
调用QWidget::setSizePolicy()以指定Widget的空间需求。
(2).每当尺寸提示、最小尺寸提示或尺寸策略发生变化时,都应调用QWidget::updateGeometry()。这将导致重新计算布局。多次连续调用 QWidget::updateGeometry()只会导致一次布局重新计算。
在Qt Creator中使用布局,如下图所示:

注:以上整理的内容主要来自于Qt官方文档