Qt中的布局

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官方文档

GitHubhttps://github.com/fengbingchun/Qt_Test

相关推荐
hssfscv15 分钟前
QT的学习笔记4——QMainWindow、资源文件以及主要控件的介绍
笔记·qt·学习
luoyayun3612 小时前
Qt + FFmpeg 音频工具:重采样实现
qt·ffmpeg·重采样
小短腿的代码世界21 小时前
Qt Bluetooth源码深度解析:从HCI协议到跨平台API的完整架构
开发语言·qt·架构
小短腿的代码世界1 天前
Qt WebEngine多进程架构与IPC通信:从Chromium多进程到Qt信号槽融合
qt·架构·系统架构
尘中远1 天前
【Qwt 7.0 系列】快速入门与核心新特性概览 —— 更现代的 Qt 数据可视化库
qt·数据可视化·绘图·qwt·科学绘图
初阳7851 天前
【Qt】系统相关(3)——多线程
qt
初阳7851 天前
【Qt】系统相关(2)——文件
开发语言·qt
尘中远2 天前
【Qwt 7.0 系列】坐标轴与刻度系统 —— 刻度引擎、网格、图例与刻度朝内
qt·数据可视化·qcustomplot·qwt·工业软件·科学绘图
sycmancia2 天前
Qt——多线程间的互斥
开发语言·qt
尘中远2 天前
【Qwt 7.0 系列】常用图表类型实战 —— 柱状图、散点图、箱线图与直方图
qt·qwt·工业软件·科学绘图