Qt:布局管理器
目录
QVBoxLayout
QHBoxLayout
QGridLayout
QFormLayout
QSpacerItem
之前使用 Ot 在界面上创建的控件,都是通过 "手动" 的方式来设定的,也就是每个控件所在的位置,都需要计算坐标,最终通过 setGeometry 或者 move 方式摆放过去
这种设定方式其实并不方便,尤其是界面如果内容比较多,不好计算,而且一个窗口大小往往是可以调整的,按照绝对定位的方式,也无法自适应窗口大小,因此 Qt 引入 "布局管理器"(Layout)机制,来解决上述问题
Qt 中提供了很多种布局管理器
- 垂直布局
- 水平布局
- 网格布局
- 表单布局
QVBoxLayout
使用 QVBoxayout 表示垂直的布局管理器,V是 vertical 的缩写
核心属性:
在构造函数中创建三个按钮,并用布局管理器管理起来:
运行结果为:
如果调整窗口的大小尺寸,按钮的位置和尺寸也会发送改变:
以代码的方式每个 widget 中只能设置一个布局管理器,但是我们可以使用图形化的方式,拖动多个布局管理器
但是这种方式创建的 layout,我们拖动窗口大小的时候,并不会自适应改变,原因如下:
- 如果在代码中创建 layout, 其实是只创建了一个 layout
- 如果在 QtDesigner 中创建的 layout, 先创建了一个 Widget,然后再在这个新的 Widget 中添加了一个 layout
刚才是先拖了 layout 过去,然后再往 layout 中拖其他控件
也可以先拖其他控件,后给这些控件套上layout
选中三个按钮后,再点击上面框出来的:
就能够完成下面的效果:
QHBoxLayout
QHBoxLayout 表示垂直的布局管理器,H是 horizontal 的缩写使用
QHBoxLayout 的核心属性和 QVBoxLayout 属性是一致的)
下面以代码的方式,将三个按钮放入水平布局管理器中:
效果为:
如果拖动窗口代码,按钮同样会自适应改变大小位置
布局管理器之间,也能进行嵌套
下面演示在垂直布局管理器中添加一个水平布局管理器:
效果为:
QGridLayout
Qt中还提供了 QGridLayout 用来实现网格布局的效果,可以达到 M*N的这种网格的效果
核心属性:
创建一个 2*2 的网格布局:
效果为:
当然了, 网格布局也可以实现水平/垂直布局管理器的效果:
下面这种写法就是每个按钮独占一行一列:
效果为:
- 即使设置成 100,100,也不会在中间搞出很大的空白空间
- 此处设置的行数和列数,只是用来决定控件之间的相对位置
刚刚创建的布局管理器,这里的控件尺寸都是均等的
当需要创建出尺寸不同的控件的时候,就可以通过拉伸系数来设置
拉伸系数就相当于设置控件之间尺寸的 比例
先创建六个按钮,并按照 2*3 的网格布局:
效果为:
接着加上下面的代码:
代码的含义就是:这三个列按照 1:1:2 的方式来设置宽度
效果为:
注意:如果拉伸系数设为 0,意思是不参与拉伸,此时按钮的宽度是固定值,即使改变窗口的大小,该按钮的大小依然不发生改变
先创建六个按钮,按照 3*2 的网格布局,并设置垂直方向的拉伸系数为 1:1:2 :
但是运行程序后,发送并不是我们预期的高度:
这里之所以没有拉伸,是因为 SizePolicy 起到的影响,SizePolicy 是 QWidget 的属性
SizePolicy 有许多属性:
- QSizePolicy::Ignored:忽略控件的尺寸,不对布局产生影响
- QSizePolicy::Minimum:控件的最小尺寸为固定值,布局时不会超过该值
- QSizePolicy::Maximum:控件的最大尺寸为固定值,布局时不会小于该值
- QSizePolicy::Preferred:控件的理想尺寸为固定值,布局时会尽量接近该值
- QSizePolicy::Expanding:控件的尺寸可以根据空间调整,尽可能占据更多空间
- QSizePolicy::Shrinking:控件的尺寸可以根据空间调整,尽可能缩小以适应空间
由于按钮垂直方向默认没有拉伸开(水平方向默认是拉伸的)
因此垂直方向不会受到拉伸系数的影响了
要想让垂直方向的拉伸系数生效,就需要让按钮先能够拉伸展开
添加下面框出来的代码:
效果如下,成功做到了垂直拉伸的情况:
QFormLayout
除了上述的布局管理器之外,Qt 还提供了 QFormLayout,属于是 QGridLayout 的特殊情况,专
门用于实现 N行2列 的表单布局
这种表单布局多用于让用户填写信息的场景,左侧列为提示,右侧列为输入框
代码编写:
效果如下:
也可以创建一个提交按钮,将提交按钮放在第二列,第一列设为 nullptr:
效果如下:
QSpacerItem
首先说明,QSpacerItem 并不是布局管理器,之所以将 QSpacerItem 放在这里,是因为 QSpacerItem 是搭配布局管理器使用的工具
使用布局管理器的时候,可能需要在控件之间,添加一段空白,就可以使用 QSpacerItem 来表示
核心属性:
使用水平布局管理器,创建两个水平方向的按钮:
此时按钮是水平方向的,只不过间距非常近:
下面添加 spacer:
效果如下:
如果将空白 spacer 放在两个按钮前面:
效果如下:
不光代码可以添加,在 图形化 界面的左侧也提供了添加的方式:
Qt:布局管理器到此结束,同样的 Qt 控件章节也就此结束了,接下来就需要学习 Qt 的窗口部分的知识了