【Qt】布局管理器

目录

一.垂直布局

1.1.核心属性

1.2.示例1------通过代码来创建布局管理器

[1.3.示例2------创建两个 QVBoxLayout](#1.3.示例2——创建两个 QVBoxLayout)

二.水平布局

2.1.核心属性

[2.2.示例1------使⽤ QHBoxLayout 管理控件](#2.2.示例1——使⽤ QHBoxLayout 管理控件)

2.3.示例2------嵌套的layout

三.网格布局

3.1.核心属性

[3.1.1. 边距属性](#3.1.1. 边距属性)

[3.1.2. 间距属性](#3.1.2. 间距属性)

[3.1.3. 拉伸系数属性](#3.1.3. 拉伸系数属性)

[3.2.示例1------使⽤ QGridLayout 管理元素](#3.2.示例1——使⽤ QGridLayout 管理元素)

[3.3.示例2------设置 QGridLayout 中元素的大小比例](#3.3.示例2——设置 QGridLayout 中元素的大小比例)

[3.4.示例3------设置 QGridLayout 中元素的大小比例](#3.4.示例3——设置 QGridLayout 中元素的大小比例)

3.5.示例4------设置垂直⽅向的拉伸系数

四.表单布局

五.Spacer


在 Qt 里,我们一开始学的时候,常常会用"绝对定位"来摆放界面上的按钮、文本框这些控件。

什么是绝对定位呢?

简单说,就是你得像告诉别人"请把杯子放在桌子左上角坐标 (10, 20) 的位置"一样,精确地计算并用 setGeometrymove 这样的方法把每个控件放到某个像素点上。

这样做有什么问题呢?

  • 非常麻烦:尤其是当界面内容很多的时候,你需要像个会计一样不停地计算和调整每个控件的位置和大小,费时费力。

  • 非常"死板":更麻烦的是,用户是可以随意调整窗口大小的。用绝对定位的界面,窗口一变,里面的控件就会"原地发呆",要么悬在半空,要么挤在一起,布局会变得一团糟,无法自动适应。

那怎么办呢?

别担心,Qt 提供了一个非常棒的解决方案------布局管理器

布局管理器就像个智能的"家长"或者"收纳盒"

  • 你只需要把控件(比如按钮、标签)放进这个"收纳盒"里。

  • 这个"家长"就会自动帮你决定这些"孩子"(控件)应该怎么排列(是横着排还是竖着排)、怎么对齐、彼此之间间隔多少。

  • 当窗口大小改变时,这个"家长"会自动重新安排所有"孩子"的位置和大小,完美地适应新窗口。

这样一来,你就不用再操心计算坐标了,而且做出的界面能灵活适应各种变化,是不是方便多了?

一.垂直布局

使⽤ QVBoxLayout 表⽰垂直的布局管理器.V是 核⼼属性 属性 vertical 的缩写.

1.1.核心属性

核心思想:把布局想象成一个"相框"

你可以把 QVBoxLayout 想象成一个垂直的、用来摆放多张照片的相框

  • 相框本身 有一个边框,这个边框到外面桌子的距离,就是外边距

  • 相框内部,每两张照片之间 的空隙,就是间距

现在,我们对照这个比喻来理解每一个属性。


  1. 外边距属性

外边距指的是整个布局 的边界与它外部容器(比如窗口)边缘之间的空白距离。它控制的是布局这个"整体"在父容器中的位置。

layoutLeftMargin - 左侧边距

  • 定义 :布局的左边缘 到其父容器(比如窗口)左边缘的空白距离。

  • 比喻 :相框的左边框到桌子左边的距离。

  • 作用 :增大这个值,会让整个布局(包括里面的所有按钮、文本框等)一起向右移动。它保证了布局内容不会紧贴着窗口的最左边。

layoutRightMargin - 右侧边距

  • 定义 :布局的右边缘 到其父容器右边缘的空白距离。

  • 比喻 :相框的右边框到桌子右边的距离。

  • 作用 :增大这个值,会让整个布局一起向左收缩。它保证了布局内容不会紧贴着窗口的最右边。

layoutTopMargin - 上方边距

  • 定义 :布局的上边缘 到其父容器上边缘(比如窗口的标题栏下方)的空白距离。

  • 比喻 :相框的上边框到桌子上方的距离。

  • 作用 :增大这个值,会让整个布局一起向下移动。它保证了布局内容不会紧贴着窗口的最顶部。

layoutBottomMargin - 下方边距

  • 定义 :布局的下边缘 到其父容器下边缘的空白距离。

  • 比喻 :相框的下边框到桌子下方的距离。

  • 作用 :增大这个值,会让整个布局一起向上收缩。它保证了布局内容不会紧贴着窗口的最底部。

外边距总结:

这四个属性是一起作用的,它们为你的布局在容器中划出了一个"安全区"或"呼吸空间"。通常,为了美观,我们会给布局设置一个统一的外边距,避免所有控件都挤在窗口边缘。


  1. 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 - 下方边距

  • 定义 :布局的下边缘 到其父容器下边缘的空白距离。

  • 比喻 :相框的下边框到桌子下方的距离。

  • 作用 :增大这个值,会让整个布局一起向上收缩。它保证了布局内容不会紧贴着窗口的最底部。

外边距总结:

这四个属性是一起作用的,它们为你的布局在容器中划出了一个"安全区"或"呼吸空间"。通常,为了美观,我们会给布局设置一个统一的外边距,避免所有控件都挤在窗口边缘。


  1. 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 方法来统一设置。

cpp 复制代码
// 设置边距:左、上、右、下 均为 10 像素
gridLayout->setContentsMargins(10, 10, 10, 10);

// 或者分别设置
gridLayout->setContentsMargins(20, 5, 20, 5); // 左右边距20,上下边距5

3.1.2. 间距属性

间距指的是网格布局内部 ,相邻的行与行列与列之间的控件距离。它控制的是格子与格子之间的"空隙"。

  • layoutHorizontalSpacing

    • 含义:同一行中,相邻两列控件之间的水平间距。

    • 作用:控制左右相邻的两个控件隔多远。

  • layoutVerticalSpacing

    • 含义:同一列中,相邻两行控件之间的垂直间距。

    • 作用:控制上下相邻的两个控件隔多远。

通俗比喻:还是那个表格,间距就是表格线本身的粗细,或者说是每个单元格之间的"隔离带"的宽度。

设置方法

cpp 复制代码
// 设置水平间距为 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中再详细讲讲

设置方法

cpp 复制代码
// 假设网格是 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() 所返回的理想大小,完全不能改变。布局管理器必须尊重这个大小,既不会给它更多空间,也不会压缩它。

  • 生活比喻:就像一个固定尺寸的相框,无论书架(布局)有多大或多小,相框本身大小不变。

  1. QSizePolicy::Minimum
  • 字面意思:最小。

  • 行为解释 :控件的 sizeHint() 返回的大小就是它的最小尺寸 。布局管理器可以给控件分配更多 的空间,但不能分配更少 的空间。控件在空间充足时会变大,但不会小于其理想大小。

  • 生活比喻:一个可以拉伸的弹簧,但它有一个最短的长度限制,你不能把它压得比这个限制更短。

  1. QSizePolicy::Maximum
  • 字面意思:最大。

  • 行为解释 :控件的 sizeHint() 返回的大小就是它的最大尺寸 。布局管理器可以给控件分配更少 的空间,但不能分配更多 的空间。控件在空间紧张时会缩小,但不会超过其理想大小。

  • 生活比喻:一个可以压缩的泡沫块,但它有一个最大的体积,你不能把它拉得比这个体积更大。

  1. QSizePolicy::Preferred
  • 字面意思:首选的。

  • 行为解释 :这是最直观的策略。控件最希望保持自己的 sizeHint() 所返回的理想大小。如果空间有多余,它不会主动去抢占;如果空间不足,它也愿意被压缩得小一点。布局会尽量满足它的理想大小。

  • 生活比喻:一个身材标准的人,他最喜欢自己现在的体型。给他穿大一点或小一点的衣服他也能接受,但最合身的还是原来那件。

  1. QSizePolicy::Expanding
  • 字面意思:扩展的。

  • 行为解释 :这是一个"积极"的策略。控件的理想大小是 sizeHint(),但它非常乐意 占据任何多余的空间。当布局中有多个控件时,所有设置为 Expanding 的控件会竞争 多余的空间,并按照一定比例进行分配。它也可以被缩小到比 sizeHint() 更小。

  • 生活比喻 :一个非常有野心的员工,他不仅能完成自己的本职工作(sizeHint),还总是积极主动地去承担任何额外的工作(多余空间)。

  1. QSizePolicy::MinimumExpanding
  • 字面意思:最小且扩展的。

  • 行为解释 :这是 MinimumExpanding 的结合。它的 sizeHint() 是其最小尺寸,它不能被压缩得更小,但同时它又非常乐意占据任何多余的空间。

  • 生活比喻 :那个可以拉伸的弹簧,它有一个最短限制(Minimum),但只要空间允许,它会尽可能地变长(Expanding)。

  1. 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 值更大。


  1. height (高度)
  • 文字描述 :这个属性定义了空白的基础高度。它表示这个空白Item在垂直方向上"希望"占据的空间。

  • 深入理解 :和 width 属性一样,height 也是一个基准值。它的最终表现高度由布局的可用空间和垂直方向的尺寸策略 (vData) 共同决定。


  1. 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 已经包含了可收缩的特性。


  1. vData (垂直方向的尺寸策略)

这个属性与 hData 完全对应,只是作用方向从水平变成了垂直 。它决定了空白Item在垂直方向上如何伸缩。

  • QSizePolicy::Ignored :布局忽略 height 值。

  • QSizePolicy::Minimumheight 是最小高度,拒绝变得更高。

  • QSizePolicy::Maximumheight 是最大高度,但可以被压缩得更矮。

  • QSizePolicy::Preferred :布局尽力实现 height 值,不伸缩。(创建固定高度空白的常用策略)

  • QSizePolicy::Expanding :积极抢占垂直方向上的多余空间。(创建垂直弹性空白的常用策略)

  • QSizePolicy::Shrinking:在垂直空间不足时愿意缩小高度。


上述属性在构造函数设置即可.


我们创建一个项目,直接编写下面这个代码

我们运行看看

那么我们就在这个的基础之上增加Spacer即可

运⾏程序,观察代码效果.可以看到两个按钮之间已经存在了间隔了.

调整QSpacerItem不同的尺⼨,即可看到不同的间距.

在QtDesigner中,也可以直接给界⾯上添加spacer

相关推荐
半夏知半秋3 小时前
skynet-socket.lua源码分析
服务器·开发语言·学习·架构·lua
西猫雷婶3 小时前
random.shuffle()函数随机打乱数据
开发语言·pytorch·python·学习·算法·线性回归·numpy
来生硬件工程师4 小时前
CH582 GPIO
c语言·开发语言·单片机
fly-phantomWing4 小时前
在命令提示符页面中用pip命令行安装Python第三方库的详细步骤
开发语言·python·pip
VBA63375 小时前
VBA数据库解决方案第二十三讲:向一个已有数据表中添加数据记录
开发语言
杜子不疼.5 小时前
【C++】玩转模板:进阶之路
java·开发语言·c++
拾忆,想起6 小时前
AMQP协议深度解析:消息队列背后的通信魔法
java·开发语言·spring boot·后端·spring cloud
林烈涛7 小时前
js判断变量是数组还是对象
开发语言·前端·javascript
可可南木7 小时前
ICT 数字测试原理 3 --SAFETYGUARD 文件
开发语言·测试工具·pcb工艺