【Qt】布局管理器
目录
一.垂直布局
1.1.核心属性
1.2.示例1——通过代码来创建布局管理器
1.3.示例2——创建两个 QVBoxLayout
二.水平布局
2.1.核心属性
2.2.示例1——使⽤ QHBoxLayout 管理控件
2.3.示例2——嵌套的layout
三.网格布局
3.1.核心属性
3.1.1. 边距属性
3.1.2. 间距属性
3.1.3. 拉伸系数属性
3.2.示例1——使⽤ QGridLayout 管理元素
3.3.示例2——设置 QGridLayout 中元素的大小比例
3.4.示例3——设置 QGridLayout 中元素的大小比例
3.5.示例4——设置垂直⽅向的拉伸系数
四.表单布局
五.Spacer
在 Qt 里,我们一开始学的时候,常常会用“绝对定位”来摆放界面上的按钮、文本框这些控件。
什么是绝对定位呢?
简单说,就是你得像告诉别人“请把杯子放在桌子左上角坐标 (10, 20) 的位置”一样,精确地计算并用 setGeometry
或 move
这样的方法把每个控件放到某个像素点上。
这样做有什么问题呢?
-
非常麻烦:尤其是当界面内容很多的时候,你需要像个会计一样不停地计算和调整每个控件的位置和大小,费时费力。
-
非常“死板”:更麻烦的是,用户是可以随意调整窗口大小的。用绝对定位的界面,窗口一变,里面的控件就会“原地发呆”,要么悬在半空,要么挤在一起,布局会变得一团糟,无法自动适应。
那怎么办呢?
别担心,Qt 提供了一个非常棒的解决方案——布局管理器。
布局管理器就像个智能的“家长”或者“收纳盒”。
-
你只需要把控件(比如按钮、标签)放进这个“收纳盒”里。
-
这个“家长”就会自动帮你决定这些“孩子”(控件)应该怎么排列(是横着排还是竖着排)、怎么对齐、彼此之间间隔多少。
-
当窗口大小改变时,这个“家长”会自动重新安排所有“孩子”的位置和大小,完美地适应新窗口。
这样一来,你就不用再操心计算坐标了,而且做出的界面能灵活适应各种变化,是不是方便多了?
一.垂直布局
使⽤ QVBoxLayout 表⽰垂直的布局管理器.V是 核⼼属性 属性 vertical 的缩写.
1.1.核心属性
核心思想:把布局想象成一个“相框”
你可以把 QVBoxLayout
想象成一个垂直的、用来摆放多张照片的相框。
-
相框本身有一个边框,这个边框到外面桌子的距离,就是外边距。
-
相框内部,每两张照片之间的空隙,就是间距。
现在,我们对照这个比喻来理解每一个属性。
1. 外边距属性
外边距指的是整个布局的边界与它外部容器(比如窗口)边缘之间的空白距离。它控制的是布局这个“整体”在父容器中的位置。
layoutLeftMargin - 左侧边距
-
定义:布局的左边缘到其父容器(比如窗口)左边缘的空白距离。
-
比喻:相框的左边框到桌子左边的距离。
-
作用:增大这个值,会让整个布局(包括里面的所有按钮、文本框等)一起向右移动。它保证了布局内容不会紧贴着窗口的最左边。
layoutRightMargin - 右侧边距
-
定义:布局的右边缘到其父容器右边缘的空白距离。
-
比喻:相框的右边框到桌子右边的距离。
-
作用:增大这个值,会让整个布局一起向左收缩。它保证了布局内容不会紧贴着窗口的最右边。
layoutTopMargin - 上方边距
-
定义:布局的上边缘到其父容器上边缘(比如窗口的标题栏下方)的空白距离。
-
比喻:相框的上边框到桌子上方的距离。
-
作用:增大这个值,会让整个布局一起向下移动。它保证了布局内容不会紧贴着窗口的最顶部。
layoutBottomMargin - 下方边距
-
定义:布局的下边缘到其父容器下边缘的空白距离。
-
比喻:相框的下边框到桌子下方的距离。
-
作用:增大这个值,会让整个布局一起向上收缩。它保证了布局内容不会紧贴着窗口的最底部。
外边距总结:
这四个属性是一起作用的,它们为你的布局在容器中划出了一个“安全区”或“呼吸空间”。通常,为了美观,我们会给布局设置一个统一的外边距,避免所有控件都挤在窗口边缘。
2. layoutSpacing - 相邻元素之间的间距
-
定义:在布局内部,相邻两个控件之间的垂直距离。
-
比喻:相框内部,上下两张照片之间的空隙。
-
作用:只影响布局内部的控件关系,不影响布局与外部容器的距离。
-
设置为
0
:控件会紧贴在一起,中间没有空隙。 -
增大这个值:每个控件之间的垂直距离都会等量增加,让界面看起来更松散、清晰。
-
减小这个值:控件会变得更紧凑。
-
关键区别:
一定要分清 layoutSpacing
(间距) 和 layoutTopMargin
等(外边距) 的区别:
-
外边距 是 整个布局 与 外部 的距离。
-
间距 是 布局内部 各个 子控件之间 的距离。
1.2.示例1——通过代码来创建布局管理器
我们创建一个新项目,然后直接写代码
我们运行一下
这个时候如果我们把它缩小
我们发现这个控件也是会跟着变化的。
通过上述代码的⽅式,只能给这个widget设定⼀个布局管理器。
实际上也可以通过Qt Designer在⼀个窗⼝中创建多个布局管理器
1.3.示例2——创建两个 QVBoxLayout
我们创建一个新项目
拖2个出来
然后我们放置PushButton
我们发现把按钮一拖到这个布局管理器里面,他就自动给我布好局了。
我们再拖几个
这个时候我们运行一下
这个时候如果我们把它缩小,他就会变成下面这个样子
嗯?这个就和上面使用代码创建的就不太一样了。
那么这就需要补充一下知识了:
在 Qt 中,一个核心规则是:每一个 Widget(控件)只能拥有一个“顶级布局管理器”。
您可以把这个顶级布局管理器想象成一个 widget 的 “总管家” 。这个管家负责管理和安排该 widget 内部所有直接子控件的摆放规则。一个家不能有两个发号施令的总管家,所以一个 widget 也只能有一个顶级布局。
这个规则在实际操作中,体现在两种常见的创建方式上:
1. 在代码中直接创建
当您在代码中,通过 new QHBoxLayout
等方式创建一个布局对象后,会调用 widget->setLayout(layout)
将它设置给目标 widget。这个过程非常直观:您就是直接为这个 widget 任命了一个“总管家”。
2. 在 Qt Designer 中可视化创建
在使用 Qt Designer 进行拖拽设计时,这个规则的操作方式略有不同,但本质完全一样。当您从工具栏拖拽一个布局(如水平布局、垂直布局)到窗体上时,Qt Designer 会自动执行一个“两步走”的操作:
-
第一步:先创建一个透明的、看不见的
QWidget
容器。 -
第二步:再为这个新创建的容器 widget 自动设置您所选择的布局,使其成为这个容器的“总管家”。
所以,您在设计器里看到的那个可以放入其他控件的布局,其实是一个 “自带管家的容器 widget” 。您之后所有的控件,都是被添加到了这个容器 widget 的布局里,而不是直接添加到主窗口。这种方法通过增加一层容器,使得构建复杂的嵌套布局变得异常灵活和清晰。
总结一下:
无论用代码还是设计器,一个 widget = 一个顶级布局的铁律不变。设计器只是通过自动创建容器 widget 的方式,将这个规则封装得更易于可视化操作,两者最终达成的效果是完全一致的。
我们可以去示例2的xml文件看看
可以看到这里有3个widget。
这种情况下layout并⾮是窗⼝widget的布局管理器,因此不会随着窗⼝⼤⼩改变.
我们刚才是先拖了 layout 过去,然后再往 layout 中拖其他控件
也可以先拖其他控件,后给这些控件套上 layout~~
现在我们把左边3个按钮进行选中
然后我们点击下面这个
点击完了之后
怎么样!!
二.水平布局
使用 QHBoxLayout 表示垂直的布局管理器.H是 horizontal 的缩写
2.1.核心属性
核心属性(和 QVBoxLayout 属性是一致的)
核心思想:把布局想象成一个“相框”
你可以把 QHBoxLayout 想象成一个垂直的、用来摆放多张照片的相框。
-
相框本身有一个边框,这个边框到外面桌子的距离,就是外边距。
-
相框内部,每两张照片之间的空隙,就是间距。
现在,我们对照这个比喻来理解每一个属性。
1. 外边距属性
外边距指的是整个布局的边界与它外部容器(比如窗口)边缘之间的空白距离。它控制的是布局这个“整体”在父容器中的位置。
layoutLeftMargin - 左侧边距
-
定义:布局的左边缘到其父容器(比如窗口)左边缘的空白距离。
-
比喻:相框的左边框到桌子左边的距离。
-
作用:增大这个值,会让整个布局(包括里面的所有按钮、文本框等)一起向右移动。它保证了布局内容不会紧贴着窗口的最左边。
layoutRightMargin - 右侧边距
-
定义:布局的右边缘到其父容器右边缘的空白距离。
-
比喻:相框的右边框到桌子右边的距离。
-
作用:增大这个值,会让整个布局一起向左收缩。它保证了布局内容不会紧贴着窗口的最右边。
layoutTopMargin - 上方边距
-
定义:布局的上边缘到其父容器上边缘(比如窗口的标题栏下方)的空白距离。
-
比喻:相框的上边框到桌子上方的距离。
-
作用:增大这个值,会让整个布局一起向下移动。它保证了布局内容不会紧贴着窗口的最顶部。
layoutBottomMargin - 下方边距
-
定义:布局的下边缘到其父容器下边缘的空白距离。
-
比喻:相框的下边框到桌子下方的距离。
-
作用:增大这个值,会让整个布局一起向上收缩。它保证了布局内容不会紧贴着窗口的最底部。
外边距总结:
这四个属性是一起作用的,它们为你的布局在容器中划出了一个“安全区”或“呼吸空间”。通常,为了美观,我们会给布局设置一个统一的外边距,避免所有控件都挤在窗口边缘。
2. layoutSpacing - 相邻元素之间的间距
-
定义:在布局内部,相邻两个控件之间的垂直距离。
-
比喻:相框内部,上下两张照片之间的空隙。
-
作用:只影响布局内部的控件关系,不影响布局与外部容器的距离。
-
设置为
0
:控件会紧贴在一起,中间没有空隙。 -
增大这个值:每个控件之间的垂直距离都会等量增加,让界面看起来更松散、清晰。
-
减小这个值:控件会变得更紧凑。
-
关键区别:
一定要分清 layoutSpacing
(间距) 和 layoutTopMargin
等(外边距) 的区别:
-
外边距 是 整个布局 与 外部 的距离。
-
间距 是 布局内部 各个 子控件之间 的距离。
2.2.示例1——使⽤ QHBoxLayout 管理控件
话不多说,直接写代码
我们把它缩小
这3个按钮都会随着窗⼝尺⼨变化⽽发⽣改变。此 时三个按钮的尺⼨和位置,都是⾃动计算出来的。
2.3.示例2——嵌套的layout
Layout ⾥⾯可以再嵌套上其他的layout,从⽽达到更复杂的布局效果
我们运行一下
结合 QHBoxLayout 和 QVBoxLayout ,就可以做出各种复杂的界⾯了
三.网格布局
Qt中还提供了 QGridLayout 用来实现网格布局的效果,可以达到 M*N的这种网格的效果
核心属性
整体和 QVBoxLayout 以及 QHBoxLayout 相似.但是设置 spacing 的时候是按照垂直水平两个
方向来设置的.
3.1.核心属性
首先,要理解 QGridLayout 就像一个 M 行 x N 列的表格,我们可以把控件(按钮、文本框等)放在这个表格的任意一个或多个格子里。而这些属性就是用来控制这个“表格”本身和内部元素之间距离、大小的。
3.1.1. 边距属性
边距指的是整个网格布局区域与其父窗口(或父控件)边界之间的距离。可以把它想象成表格外部的“页边距”。
-
layoutLeftMargin
-
含义:布局左侧与父窗口左边界的距离。
-
作用:控制整个布局区域距离窗口左边缘有多远。
-
-
layoutRightMargin
-
含义:布局右侧与父窗口右边界的距离。
-
作用:控制整个布局区域距离窗口右边缘有多远。
-
-
layoutTopMargin
-
含义:布局顶部与父窗口上边界的距离。
-
作用:控制整个布局区域距离窗口上边缘有多远。
-
-
layoutBottomMargin
-
含义:布局底部与父窗口下边界的距离。
-
作用:控制整个布局区域距离窗口下边缘有多远。
-
通俗比喻:你有一张A4纸(父窗口),你在上面画了一个表格(QGridLayout)。页边距就是你画的表格距离A4纸四条边的距离。
设置方法:
在代码中,通常使用 setContentsMargins
方法来统一设置。
// 设置边距:左、上、右、下 均为 10 像素
gridLayout->setContentsMargins(10, 10, 10, 10);// 或者分别设置
gridLayout->setContentsMargins(20, 5, 20, 5); // 左右边距20,上下边距5
3.1.2. 间距属性
间距指的是网格布局内部,相邻的行与行、列与列之间的控件距离。它控制的是格子与格子之间的“空隙”。
-
layoutHorizontalSpacing
-
含义:同一行中,相邻两列控件之间的水平间距。
-
作用:控制左右相邻的两个控件隔多远。
-
-
layoutVerticalSpacing
-
含义:同一列中,相邻两行控件之间的垂直间距。
-
作用:控制上下相邻的两个控件隔多远。
-
通俗比喻:还是那个表格,间距就是表格线本身的粗细,或者说是每个单元格之间的“隔离带”的宽度。
设置方法:
// 设置水平间距为 15 像素,垂直间距为 10 像素
gridLayout->setHorizontalSpacing(15);
gridLayout->setVerticalSpacing(10);// 或者使用 setSpacing,但这个会同时设置水平和垂直间距(不推荐在需要不同值时使用)
// gridLayout->setSpacing(10);
3.1.3. 拉伸系数属性
这是网格布局中最强大、最核心的属性之一,用于控制当父窗口大小发生变化时,行和列如何按比例分配额外的空间。它决定了布局的弹性。
-
layoutRowStretch
-
含义:一个数组,存储了每一行的“拉伸因子”。
-
作用:当窗口高度增加时,这些多出来的高度会按照每行设定的拉伸因子比例分配给各行。因子为0的行不会被拉伸。
-
工作原理:假设有两行,拉伸因子分别是 1 和 2。当窗口变高时,第一行会分到额外高度的 1/(1+2) = 1/3,第二行会分到 2/3。
-
-
layoutColumnStretch
-
含义:一个数组,存储了每一列的“拉伸因子”。
-
作用:当窗口宽度增加时,这些多出来的宽度会按照每列设定的拉伸因子比例分配给各列。因子为0的列不会被拉伸。
-
工作原理:同
layoutRowStretch
,只不过是水平方向。
-
通俗比喻:想象一个用几根橡皮筋做的表格。拉伸系数就是每根橡皮筋的“弹性强度”。系数大的橡皮筋,你轻轻一拉它就伸得很长;系数为0的就像一根绳子,怎么拉也拉不动。
我们会在下面的例子2中再详细讲讲
设置方法:
// 假设网格是 2行 x 3列// 设置列的拉伸系数:第0列不拉伸,第1列拉伸因子为1,第2列拉伸因子为2
gridLayout->setColumnStretch(0, 0); // 第一列固定宽度
gridLayout->setColumnStretch(1, 1); // 第二列可拉伸
gridLayout->setColumnStretch(2, 2); // 第三列拉伸性是第二列的两倍// 设置行的拉伸系数:第0行拉伸因子为1,第1行拉伸因子为1
gridLayout->setRowStretch(0, 1);
gridLayout->setRowStretch(1, 1);
3.2.示例1——使⽤ QGridLayout 管理元素
我们直接写代码
运行一下,
可以看到当前的这⼏个按钮是按照2⾏2列的⽅式排列的
我们把它缩小一下
如果调整⾏列坐标为下列代码
我们运行一下
执⾏代码,可以看到这⼏个按钮都在同⼀⾏了.相当于 QHBoxLayout
此处也要注意,设置⾏和列的时候,如果设置的是⼀个很⼤的值,但是这个值和上⼀个值之间并 没有其他的元素,那么并不会在中间腾出额外的空间
我们再修改一下
我们运行一下
可以看到这个我们设置列号的大小不是真正的列号,他只是作为一个评判哪个控制在前或在后的依据。
我们接着调整一下代码
可以看到这⼏个按钮都在同⼀列了.相当于 QVBoxLayout
此处也要注意,设置⾏和列的时候,如果设置的是⼀个很⼤的值,但是这个值和上⼀个值之间并 没有其他的元素,那么并不会在中间腾出额外的空间
我们修改一下代码
可以看到这个我们设置行号的大小不是真正的行号,他只是作为一个评判哪个控制在前或在后的依据。
任意调整⾏列,即可看到不同的效果.
我们接着修改一下代码
我们运行一下
3.3.示例2——设置 QGridLayout 中元素的大小比例
我们创建一个新项目,编写下面这个代码
初始状态(窗口最小尺寸时):
场景一:让两列平均伸展
我们设置:
计算:
-
总份数 = 1 + 1 = 2
-
第0列分得 1/2 的额外宽度
-
第1列分得 1/2 的额外宽度
效果: 当窗口拉宽时,两列会等比例变宽,按钮始终保持在布局的中间部分。
场景三:让第一列伸展得比第二列多
我们设置:
计算:
-
总份数 = 3 + 1 = 4
-
第0列分得 3/4 的额外宽度
-
第1列分得 1/4 的额外宽度
效果: 当窗口拉宽时,第一列伸展的幅度是第二列的3倍。
场景四:混合使用行和列拉伸
我们设置:
效果:
对于列来说
-
总拉伸因子 = 1 + 2 = 3
-
第0列所占比例 = 1 ÷ 3 = 33.3%
-
第1列所占比例 = 2 ÷ 3 = 66.7%
对于行来说
-
总拉伸因子 = 1 + 3 = 4
-
第0行所占比例 = 1 ÷ 4 = 25%
-
第1行所占比例 = 3 ÷ 4 = 75%
也就是说当窗口同时被拉宽和拉高时:
-
宽度上,第二列比第一列伸展得多。
-
高度上,第二行比第一行伸展得多得多。
我们运行一下
嗯?高度怎么没变啊!!
这其实是控件的垂直尺寸策略(sizePolicy)问题,我们需要来设置一下
sizePolicy
首先我们需要了解一个东西
sizeHint()
是控件向布局系统提出的"理想尺寸建议"。它不是一个命令,而是一个友好的建议,意思是:"嘿,布局管理器,如果条件允许,我觉得我这个尺寸最合适、最漂亮、最好用。"
-
布局管理器会优先考虑这个值,但不保证一定会采用
一般就有下面这些策略
1. QSizePolicy::Fixed
-
字面意思:固定的。
-
行为解释:控件的大小就是它的
sizeHint()
所返回的理想大小,完全不能改变。布局管理器必须尊重这个大小,既不会给它更多空间,也不会压缩它。 -
生活比喻:就像一个固定尺寸的相框,无论书架(布局)有多大或多小,相框本身大小不变。
2. QSizePolicy::Minimum
-
字面意思:最小。
-
行为解释:控件的
sizeHint()
返回的大小就是它的最小尺寸。布局管理器可以给控件分配更多的空间,但不能分配更少的空间。控件在空间充足时会变大,但不会小于其理想大小。 -
生活比喻:一个可以拉伸的弹簧,但它有一个最短的长度限制,你不能把它压得比这个限制更短。
3. QSizePolicy::Maximum
-
字面意思:最大。
-
行为解释:控件的
sizeHint()
返回的大小就是它的最大尺寸。布局管理器可以给控件分配更少的空间,但不能分配更多的空间。控件在空间紧张时会缩小,但不会超过其理想大小。 -
生活比喻:一个可以压缩的泡沫块,但它有一个最大的体积,你不能把它拉得比这个体积更大。
4. QSizePolicy::Preferred
-
字面意思:首选的。
-
行为解释:这是最直观的策略。控件最希望保持自己的
sizeHint()
所返回的理想大小。如果空间有多余,它不会主动去抢占;如果空间不足,它也愿意被压缩得小一点。布局会尽量满足它的理想大小。 -
生活比喻:一个身材标准的人,他最喜欢自己现在的体型。给他穿大一点或小一点的衣服他也能接受,但最合身的还是原来那件。
5. QSizePolicy::Expanding
-
字面意思:扩展的。
-
行为解释:这是一个“积极”的策略。控件的理想大小是
sizeHint()
,但它非常乐意占据任何多余的空间。当布局中有多个控件时,所有设置为Expanding
的控件会竞争多余的空间,并按照一定比例进行分配。它也可以被缩小到比sizeHint()
更小。 -
生活比喻:一个非常有野心的员工,他不仅能完成自己的本职工作(
sizeHint
),还总是积极主动地去承担任何额外的工作(多余空间)。
6. QSizePolicy::MinimumExpanding
-
字面意思:最小且扩展的。
-
行为解释:这是
Minimum
和Expanding
的结合。它的sizeHint()
是其最小尺寸,它不能被压缩得更小,但同时它又非常乐意占据任何多余的空间。 -
生活比喻:那个可以拉伸的弹簧,它有一个最短限制(
Minimum
),但只要空间允许,它会尽可能地变长(Expanding
)。
7. QSizePolicy::Ignored
-
字面意思:忽略的。
-
行为解释:这个策略最特殊。它告诉布局管理器:“别管我的
sizeHint()
了”。布局管理器会把它当作一个最小尺寸为 0,最大尺寸为无穷大的控件来处理。它的实际大小完全由布局和它周围的控件决定。 -
生活比喻:一个完全没有主见的人,你把他安排在什么位置,他就待在什么位置,你把他拉多长,他就变多长。
我们把代码修改成下面这样子
我们再次运行一下
3.4.示例3——设置 QGridLayout 中元素的大小比例
我们直接写代码
运行结果
3.5.示例4——设置垂直⽅向的拉伸系数
另外,QGridLayout 也提供了 setRowStretch 设置行之间的拉伸系数。
上述案例中,直接设置 setRowStretch 效果不明显,因为每个按钮的高度是固定的,需要把按钮的垂直方向的 sizePolicy 属性设置为 QSizePolicy::Expanding 尽可能填充满布局管理器,才能看到效果。
此时的按钮垂直⽅向都舒展开了.并且调整窗⼝尺⼨,也会按照设定的⽐例同步变化.
总的来说,使用 QGridLayout 能够代替很多 QHBoxLayout 和 QVBoxLayout 嵌套的场景.毕竟嵌套的代码写起来是比较麻烦的.
另外不要忘了,QGridLayout 里面也能嵌套 QHBoxLayout 和 QVBoxLayoutQHBoxLayout和QVBoxLayout 里面也能嵌套 QGridLayout.
灵活使用上述布局管理器,就可以实现出任意的复杂界面.
四.表单布局
除了上述的布局管理器之外,Qt还提供了 QFormLayout,属于是 QGridLayout 的特殊情况,专门用于实现两列表单的布局.
这种表单布局多用于让用户填写信息的场景,左侧列为提示,右侧列为输入框
我们直接看例子
执⾏程序,可以看到以下结果
五.Spacer
使⽤布局管理器的时候,可能需要在控件之间,添加⼀段空⽩,就可以使⽤ QSpacerItem 来表⽰
QSpacerItem
的本质是在布局中创建一个“弹性空间”或“固定空间”,用来推挤和控制其他控件的位置。
1. width (宽度)
-
文字描述:这个属性定义了空白的基础宽度。你可以把它想象成这个空白Item所“希望”拥有的宽度值。
-
深入理解:这个值并不总是最终显示的绝对宽度。它更像是一个与
sizePolicy
(尺寸策略) 配合使用的基准值或参考值。最终的实际宽度会根据布局中的可用空间和设置的尺寸策略来决定。例如,如果策略是Expanding
,那么它可能会变得比这个width
值更大。
2. height (高度)
-
文字描述:这个属性定义了空白的基础高度。它表示这个空白Item在垂直方向上“希望”占据的空间。
-
深入理解:和
width
属性一样,height
也是一个基准值。它的最终表现高度由布局的可用空间和垂直方向的尺寸策略 (vData
) 共同决定。
3. hData (水平方向的尺寸策略)
这个属性决定了空白Item在水平方向上如何随着布局空间的变化而拉伸或收缩。它是一个枚举值,具体行为如下:
-
QSizePolicy::Ignored
(忽略)-
描述:布局会完全忽略你设置的
width
值。 -
效果:这个空白Item在水平方向上将表现得“没有实体”,几乎不占用空间。通常用于在需要完全弹性的地方创建一个“零宽度”的占位符,但实践中较少用于Spacer。
-
-
QSizePolicy::Minimum
(最小)-
描述:
width
值被视为最小宽度。 -
效果:这个空白Item的宽度不能小于你设置的
width
值,但如果布局中有多余空间,它也拒绝变宽。它会保持一个固定的最小宽度。
-
-
QSizePolicy::Maximum
(最大)-
描述:
width
值被视为最大宽度。 -
效果:这个空白Item的宽度不能大于你设置的
width
值,但为了适应布局,它可以被压缩到更小。适合用来限制一个空白不会无限变大。
-
-
QSizePolicy::Preferred
(首选)-
描述:
width
值被视为最理想的宽度。 -
效果:布局会尽力给予它这个精确的宽度。如果空间不足,它不愿意被压缩得更小;如果空间多余,它也不愿意扩张得更大。这是创建固定大小空白最常用的策略。
-
-
QSizePolicy::Expanding
(扩展)-
描述:
width
值可以被视为一个有益的建议或最小宽度。 -
效果:这是最“贪婪” 的策略。它首先会保证自己至少有
width
那么宽。然后,如果布局中还有多余的空间,它会积极地、尽可能多地去抢占这些空间,把其他控件“推”到一边。这是创建弹性空白(或称“弹簧”)最常用的策略,用于将控件推到窗口的一侧。
-
-
QSizePolicy::Shrinking
(可收缩)-
描述:当空间不足时,它愿意缩小自己。
-
效果:这个策略表示Item可以缩小到比
width
值更小,以适应狭窄的空间。但它不像Expanding
那样会主动扩张。这个策略单独使用较少,通常Expanding
已经包含了可收缩的特性。
-
4. vData (垂直方向的尺寸策略)
这个属性与 hData
完全对应,只是作用方向从水平变成了垂直。它决定了空白Item在垂直方向上如何伸缩。
-
QSizePolicy::Ignored
:布局忽略height
值。 -
QSizePolicy::Minimum
:height
是最小高度,拒绝变得更高。 -
QSizePolicy::Maximum
:height
是最大高度,但可以被压缩得更矮。 -
QSizePolicy::Preferred
:布局尽力实现height
值,不伸缩。(创建固定高度空白的常用策略) -
QSizePolicy::Expanding
:积极抢占垂直方向上的多余空间。(创建垂直弹性空白的常用策略) -
QSizePolicy::Shrinking
:在垂直空间不足时愿意缩小高度。
上述属性在构造函数设置即可.
我们创建一个项目,直接编写下面这个代码
我们运行看看
那么我们就在这个的基础之上增加Spacer即可
运⾏程序,观察代码效果.可以看到两个按钮之间已经存在了间隔了.
调整QSpacerItem不同的尺⼨,即可看到不同的间距.
在QtDesigner中,也可以直接给界⾯上添加spacer