Qt:布局管理器

devtools/2025/2/28 17:29:06/

目录

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.ppmy.cn/devtools/163399.html

相关文章

CSS处理内容溢出

<!DOCTYPE html> <html lang"zh-cn"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>处理内容溢出</title><style>#d1{wid…

DeepSeek集成IT技术开发方向全景解读:重构智能开发新范式

一、技术架构革命:支撑IT开发集成的三大引擎 1. 动态MoE架构(DeepSeekMoE-32B) 通过混合专家系统实现精准任务路由,在软件开发场景中展现出显著优势: 代码生成场景:激活Java/Python/C++等语言专家模块,单元测试覆盖率提升至85%硬件资源优化:FP16量化下推理显存需求低…

2025年软考报名费用是多少?全国费用汇总!

软考报名时间终于确定了&#xff01;想要参加2025年软考的同学们注意啦&#xff01;特别是那些一年只有一次考试机会的科目&#xff0c;千万不要错过哦&#xff01;这里为大家整理了各地的报名时间、科目、费用等信息&#xff0c;快来看看吧&#xff01; 一、2025年软考时间安…

git 国内源

git config --global url.“https://hub.fastgit.xyz/”.insteadOf “https://github.com/” git config --global url.“https://hub.fastgit.xyz/”.insteadOf “git://github.com/” 取消 FastGit 代理: git config --global --unset url.“https://hub.fastgit.xyz/”.in…

MySQL表约束的种类与应用

在MySQL数据库中&#xff0c;表约束是确保数据完整性的关键。约束限制了可以在表中插入或更新的数据类型&#xff0c;保证数据的准确性和可靠性。了解MySQL中的各种表约束对于数据库设计和数据维护至关重要。以下是MySQL支持的主要表约束类型及其应用的详细介绍。 1. 主键约束…

2025 IAST工具推荐 ︱IAST工具如何赋能企业开发安全?

IAST交互式应用程序安全测试&#xff08;Interactive Application Security Testing&#xff09;是Gartner 2012年提出的一种新型运行时应用安全测试方案&#xff0c;规避了黑盒安全扫描DAST和白盒代码审计技术的主要技术缺陷&#xff0c;通过代理/VPN、旁路流量镜像、透明流量…

Java I/O 与 NIO 核心区别及应用场景详解

一、核心概念对比 特性传统 I/O (BIO)NIO (New I/O)模型同步阻塞模型同步非阻塞模型数据流方向单向流&#xff08;InputStream/OutputStream&#xff09;双向通道&#xff08;Channel&#xff09;数据操作单元基于字节/字符流基于缓冲区&#xff08;Buffer&#xff09;线程模型…

【Stable Diffusion】AnimatedDiff--AI动画 插件使用技巧分享;文生视频、图生视频、AI生成视频工具;

本专栏主要记录人工智能的应用方面的内容,包括chatGPT、DeepSeek、AI绘画等等; 在当今AI的热潮下,不学习AI,就要被AI淘汰;所以欢迎小伙伴加入本专栏和我一起探索AI的应用,通过AI来帮助自己提升生产力; 本文的目标就是让每一个读者,都能学会并掌握AnimateDiff的使用;成…