当前位置: 首页 > article >正文

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 的窗口部分的知识了


http://www.kler.cn/a/562029.html

相关文章:

  • AI将会取代生活的方方面面吗?
  • 记录此刻:历时两月,初步实现基于FPGA的NVMe SSD固态硬盘存储控制器设计!
  • SUSE15SP4 网络配置连外网
  • 货车一键启动无钥匙进入手机远程启动的正确使用方法
  • OkHttp、Retrofit、RxJava:一文讲清楚
  • 前端如何转战鸿蒙
  • ubuntu离线安装Ollama并部署Llama3.1 70B INT4
  • 超越云计算:计算连续体中的无服务器函数
  • 【C++】Arrays
  • 从 Spring Boot 2 升级到 Spring Boot 3 的终极指南
  • STM32开发方式
  • 【Python爬虫(71)】用Python爬虫解锁教育数据的奥秘
  • 安装VM和Centos
  • 前端(layui表单对应行颜色、登陆页面、轮播)
  • Spring三级缓存解密:循环依赖破局之道
  • H13-821 V3.0 HCIP 华为云服务架构题库
  • 「软件设计模式」命令模式(Command)
  • Crack SmartGit
  • 使用虚拟IP会封号吗?静态IP上网速度会不会比动态IP更快?
  • 《苍穹外卖》电商实战项目(java)知识点整理(P1~P65)【上】