【qt】 布局器
参考博客:https://blog.csdn.net/Fdog_/article/details/107522283
目录
- 布局管理器概念
- 常见的布局管理器及特点
- 🔵`QHBoxLayout`水平布局
- 🔵`QVBoxLayout`垂直布局
- 🔵`QGridLayout`网格布局
- 🔵`QFormLayout`表单布局
- QT 高级布局器
- 🔵`QStackedLayout`堆叠布局
- 🔵`QDockWidget`停靠布局
- 🔵分裂器(QSplitter)
- 🔵`Spacers`(空间间隔器/弹簧)
- 布局常用方法总结
- 🔵设置控件比例
- 🔵设置控件大小策略
布局管理器概念
布局是一种优雅而灵活的方式,可以在其容器中自动排列子小部件。每个小部件通过 sizeHint 和 sizePolicy 属性向布局报告其大小要求,布局相应地分配可用空间。
Qt 共提供了 5 种布局管理器,每种布局管理器对应一个类,分别是 QHBoxLayout(水平布局)、QVBoxLayout(垂直布局)、QGridLayout(网格布局)、QFormLayout(表单布局)和 QStackedLayout(分组布局),这些类直接或间接都是由QLayout派生过来的,关系如下

布局管理器不是界面组件,而是界面组件的定位策略。它们也相当于是一个容器,可以将任意容器类型的组件或者布局放在布局管理器中。
常见的布局管理器及特点
| 布局 | 类名 | 特点 |
|---|---|---|
| 水平布局 | QHBoxLayout | 水平方向排列控件 |
| 垂直布局 | QVBoxLayout | 垂直方向排列控件 |
| 网格布局 | QGridLayout | 类似 Excel,使用行列管理控件 |
| 表单布局 | QFormLayout | 左侧是标签,右侧是输入框,适用于表单界面 |
| 自由布局 | QStackedLayout | 叠放多个控件,每次只显示一个 |
| 绝对布局 | setGeometry() | 手动设置控件的绝对位置(不推荐) |
特点
1️⃣只要使用了布局管理器,控件的大小位置不能再修改,
如果要调整控件大小通过策略, 最大值,最小值调整,添加辅助控件。2️⃣布局管理器除了可以组件进行布局以外,还有一个重要的用途,就是
使得组件随着窗口的大小变化而变化。3️⃣分裂器水平布局和分裂器垂直布局,跟水平布局和垂直布局最大的区别:使用分裂器进行布局时,组件随分裂器可以改变大小
布局有关的选项及对应关系


🔵QHBoxLayout水平布局
- 控件从左到右排列。
- 窗口变大时,控件会自动扩展。
QPushButton *btn1 = new QPushButton("按钮 1");
QPushButton *btn2 = new QPushButton("按钮 2");QHBoxLayout *layout = new QHBoxLayout; // 水平布局
layout->addWidget(btn1);//按钮添加到布局管理器中
layout->addWidget(btn2);w.setLayout(layout);//设置当前界面(widget)的布局管理器
w.show();
UI Designer 拖拽生成

🔵QVBoxLayout垂直布局
所有控件 从上到下排列,适用于 侧边栏、按钮组等。
QVBoxLayout *layout = new QVBoxLayout; // 垂直布局
layout->addWidget(new QPushButton("按钮 1"));
layout->addWidget(new QPushButton("按钮 2"));
layout->addWidget(new QPushButton("按钮 3"));QWidget *window = new QWidget;
window->setLayout(layout);
window->show();
UI Designer 拖拽生成

🔵QGridLayout网格布局
将控件放置到网格中布局,它本身会从父窗口或父布局中占据尽可能多的界面空间,然后把自己的空间划分为行和列,再把每个控件塞到设置好的一个或多个单元格中。通常情况下
QGridLayout不需要自己添加空白条
QSpacerItem,因为其他功能控件把各自的单元格占据之后,剩下没控件占据的单元格自然就是空的,空的格子默认里面什么都没有,也没有空白条。
QGridLayout *layout = new QGridLayout();
layout->addWidget(new QPushButton("按钮 1"), 0, 0); // (行, 列)
layout->addWidget(new QPushButton("按钮 2"), 0, 1);
layout->addWidget(new QPushButton("按钮 3"), 1, 0);
layout->addWidget(new QPushButton("按钮 4"), 1, 1);window.setLayout(layout);
UI Designer 拖拽生成

此种布局方式无法随着窗口大小而动态改变大小,给窗口设置网格布局即可。


🔵QFormLayout表单布局
常用于 登录界面、设置窗口,左侧是标签,右侧是输入框。
QFormLayout *layout = new QFormLayout;
layout->addRow("姓名:", new QLineEdit);
layout->addRow("密码:", new QLineEdit);
layout->addRow(new QPushButton("登录"));QWidget *window = new QWidget;
window->setLayout(layout);
window->show();
UI Designer 拖拽生成

QT 高级布局器
Qt中的高级布局管理器,包括QStackedLayout、QDockWidget和QSplitter,接下来我们一个·一个学习。
🔵QStackedLayout堆叠布局
- QStackedLayout 是一种布局管理器,它允许在同一区域显示多个 QWidget,并在它们之间进行切换。在 QStackedLayout
中,只有一个 QWidget 可见,其他 QWidget 被隐藏。可以使用setCurrentIndex() 或 setCurrentWidget() 函数在 QWidget 之间进行切换。- 通过索引或控件指针切换页面
- 适用于向导界面(Wizard)、选项卡界面(Tab)、动画切换界面。
#include <QApplication>
#include <QStackedLayout>
#include <QVBoxLayout>
#include <QPushButton>
#include <QLabel>int main(int argc, char *argv[])
{QApplication a(argc, argv);QWidget w;w.setWindowTitle("QStackedLayout测试");QStackedLayout slay;QVBoxLayout vlay(&w);QPushButton *bt = new QPushButton("切换");vlay.addWidget(bt);vlay.addLayout(&slay);slay.addWidget(new QLabel("第一个窗口"));slay.addWidget(new QLabel("第二个窗口"));slay.addWidget(new QLabel("第三个窗口"));slay.addWidget(new QLabel("第四个窗口"));QObject::connect(bt, &QPushButton::clicked, [&]()->void{int curr = slay.currentIndex();curr++;if(curr>=slay.count()) curr=0;slay.setCurrentIndex(curr);});w.show();return a.exec();
}

UI Designer 拖拽生成

- 对象树(Object Inspector) → 右键
QStackedWidget来 添加/删除/切换页面。 - 属性编辑器(Property Editor) → 设置
currentIndex来改变默认页面。 - 信号和槽(Signals & Slots) → 让 按钮控制 QStackedWidget 页面切换。
🔵QDockWidget停靠布局
QDockWidget 是 Qt 提供的一种 可停靠(Dockable)窗口组件,它可以作为 主窗口(QMainWindow)的子窗口,可以拖动、停靠到不同的区域,甚至可以浮动到外部窗口。QDockWidget由一个标题栏和一个可停靠的QWidget组成,标题栏包括一个关闭按钮和一个可停靠按钮。
#include <QApplication>
#include <QMainWindow>
#include <QDockWidget>
#include <QTextEdit>int main(int argc, char *argv[]) {QApplication app(argc, argv);QMainWindow mainWindow;mainWindow.setWindowTitle("QDockWidget 示例");// 创建中心部件(必须设置,否则主窗口无法停靠)QTextEdit *textEdit = new QTextEdit(&mainWindow);mainWindow.setCentralWidget(textEdit);// 创建可停靠窗口QDockWidget *dockWidget = new QDockWidget("停靠窗口", &mainWindow);dockWidget->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);// 停靠窗口内放置控件QTextEdit *dockTextEdit = new QTextEdit();dockWidget->setWidget(dockTextEdit);// 将 QDockWidget 添加到主窗口mainWindow.addDockWidget(Qt::LeftDockWidgetArea, dockWidget);mainWindow.resize(800, 600);mainWindow.show();return app.exec();
}

UI Designer 拖拽生成

- 右侧可以查看 Dock Widge 可以设置的属性,在代码中实现也是相同的名字,只需 setXXX 即可
🔵分裂器(QSplitter)
QSplitter(分裂器) 是 Qt 提供的一种特殊布局管理方式,它允许用户通过 拖动分隔条 来
动态调整控件大小。它与 QHBoxLayout(水平布局) 和 QVBoxLayout(垂直布局)
的主要区别在于:
- 普通布局(QHBoxLayout/QVBoxLayout): 控件的大小通常是
自动分配的,不能手动调整大小。- 分裂器布局(QSplitter):
控件可以通过 拖动分隔条 来
手动调整大小,提供更灵活的 UI 体验。- 可以通过setStretchFactor()函数来设置子控件的拉伸系数,从而实现动态调整布局。

使用属性中的handleWidth可调节组件之间的间距。
属性中的opaqueResize默认情况下(打勾),使用鼠标拖动分割子窗口间的边界时,子窗口会动态的改变其大小。然而,如果希望在松开鼠标时才改变其大小,可以设置下面的参数,取消其勾选状态即可

🔵Spacers(空间间隔器/弹簧)
QSpacerItem 主要用于 在控件之间创建“空白空间”,可以:
- 推挤控件,让它们靠左、靠右、居中或对齐底部。
- 填充空白区域,保持界面美观。
- 在窗口大小调整时,动态改变大小,以适应不同的屏幕尺寸。

布局常用方法总结
🔵设置控件比例
像Vertical Layouts(垂直布局),Horizontal Layouts(水平布局),Grid Layouts(网络布局),Form Layouts(窗体布局)可以在这个地方设置控件之间的比例

🔵设置控件大小策略

代码中实现如下
btn->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
相关文章:
【qt】 布局器
参考博客:https://blog.csdn.net/Fdog_/article/details/107522283 目录 布局管理器概念常见的布局管理器及特点🔵QHBoxLayout水平布局🔵QVBoxLayout垂直布局 🔵QGridLayout网格布局 🔵QFormLayout表单布局 QT 高级布…...
Hosts文件与DNS的关系:原理、应用场景与安全风险
目录 引言 Hosts文件与DNS的基本概念 2.1 什么是Hosts文件? 2.2 什么是DNS? Hosts文件与DNS的关系 Hosts文件的应用场景 4.1 本地开发与测试 4.2 屏蔽广告与恶意网站 4.3 绕过DNS污染或劫持 Hosts文件的优势 5.1 解析速度快 5.2 不受DNS缓存影…...
VMware Windows Tools 存在认证绕过漏洞(CVE-2025-22230)
漏洞概述 博通公司(Broadcom)近日修复了 VMware Windows Tools 中存在的一个高危认证绕过漏洞,该漏洞编号为 CVE-2025-22230(CVSS 评分为 9.8)。VMware Windows Tools 是一套实用程序套件,可提升运行在 VM…...
pnpm 依赖升级终极指南:从语义化版本控制到 Monorepo 全局更新的企业级实践
要使用 pnpm 更新所有依赖包,可以通过以下命令实现: 1. 更新所有依赖到符合语义化版本的范围 pnpm update该命令会根据 package.json 中定义的版本范围(如 ^1.0.0 或 ~2.3.4)更新依赖包到最新兼容版本,但不会突破版本…...
Sentinel[超详细讲解]-2
异常处理 默认情况下,Sentinel 会抛出 BlockException 异常,如果希望自定义异常,则可以使用 SentinelResource 注解的 blockHandler 属性。 1、自定义异常处理 BlockExceptionHandler 自定义异常处理类实现 BlockExceptionHandler 接口&#…...
【问题解决】Linux安装conda修改~/.bashrc配置文件后,root 用户下显示 -bash-4.2#
问题描述 在Linux安装conda下的python环境时候,修改了~/.bashrc文件,修改完成后,再次进入服务器后,登录时候显示的不是正常的[rootlocalhost ~]#,而是-bash-4.2# 原因分析: 网上原因有:/root下…...
优化webpack打包体积思路
Webpack 打包过大的问题通常会导致页面加载变慢,影响用户体验。可以从代码优化、依赖优化、构建优化等多个角度入手来减少打包体积: 代码优化 (1)按需加载(代码拆分) ① 路由懒加载 如果你的项目使用 Vu…...
RabbitMQ 技术详解:异步消息通信的核心原理与实践
这里写目录标题 RabbitMQ 技术详解:异步消息通信的核心原理与实践一、RabbitMQ 本质剖析核心架构组件 二、核心功能与应用场景主要作用典型应用场景 三、工作流程深度解析消息传递流程关键协议机制 四、Java 实现示例1. 依赖配置(Maven)2. 消…...
CF每日5题Day4(1400)
好困,感觉很累,今天想赶紧写完题早睡。睡眠不足感觉做题都慢了。 1- 1761C 构造 void solve(){int n;cin>>n;vector<vector<int>>a(n1);forr(i,1,n){//保证每个集合不同a[i].push_back(i);}forr(i,1,n){string s;cin>>s;forr(…...
LLM架构解析:NLP基础(第一部分)—— 模型、核心技术与发展历程全解析
本专栏深入探究从循环神经网络(RNN)到Transformer等自然语言处理(NLP)模型的架构,以及基于这些模型构建的应用程序。 本系列文章内容: NLP自然语言处理基础(本文)词嵌入࿰…...
k近邻算法K-Nearest Neighbors(KNN)
算法核心 KNN算法的核心思想是“近朱者赤,近墨者黑”。对于一个待分类或预测的样本点,它会查找训练集中与其距离最近的K个样本点(即“最近邻”)。然后根据这K个最近邻的标签信息来对当前样本进行分类或回归。 在分类任务中&#…...
Dubbo(21)如何配置Dubbo的注册中心?
在分布式系统中,注册中心是一个关键组件,用于服务的注册和发现。Dubbo 支持多种注册中心,包括 ZooKeeper、Nacos、Consul、Etcd 等。下面详细介绍如何配置 Dubbo 的注册中心,以 ZooKeeper 为例。 配置步骤 引入依赖:…...
【Android15 ShellTransitions】(九)结束动画+Android原生ANR问题分析
finishTransition这部分的内容不多,并且我个人的实际工作中很少接触这块,因此我之前都觉得没有必要专门开一篇去分析最后留下的这一丁点儿的动画流程。但是最近碰到了一个google原生ANR问题,正好是和这块相关的,也让我意识到了fin…...
如何让DeepSeek-R1在内网稳定运行并实现随时随地远程在线调用
前言:最近,国产AI圈里的新星——Deepseek,简直是火到不行。但是,你是不是已经对那些千篇一律的手机APP和网页版体验感到腻味了?别急,今天就带你解锁一个超炫的操作:在你的Windows电脑上本地部署…...
STM32通用定时器结构框图
STM32单片机快速入门 通用定时器框图 TIM9和TIM12 通用定时器框图 TIM9和TIM12 (二) 通用定时器框图...
How to install vmware workstation pro on Linux mint 22
概述 VMware 是一家专注于虚拟化技术和云计算解决方案的全球领先软件公司,成立于1998年,总部位于美国加州。它的核心技术是通过“虚拟化”将一台物理计算机的硬件资源(如CPU、内存、存储等)分割成多个独立的虚拟环境(…...
深度学习 Deep Learning 第11章 实用方法论
深度学习 Deep Learning 第11章 实用方法论 章节概述 本章深入探讨了机器学习在实际应用中的方法论,强调了从确定目标到逐步优化的系统性过程。在机器学习项目中,明确的目标和性能指标是指导整个开发过程的关键。通过建立初始的端到端系统,…...
【常用的中间件】
中间件(Middleware)是位于客户端和服务器之间的软件层,用于处理客户端请求和服务器响应之间的各种任务。中间件可以提供多种功能,如负载均衡、消息队列、缓存、身份验证等。以下是常用的中间件及其作用: 1. 消息队列中…...
如何排查C++程序的CPU占用过高的问题
文章目录 可能的原因程序设计的BUG系统资源问题恶意软件硬件问题 通常步骤一个简单的问题代码在windows平台上如何排查Windows Process ExplorerWinDBG 在Linux平台如何排查使用TOP GDBPerf 可能的原因 程序设计的BUG 有死循环低效算法与数据结构滥用自旋锁频繁的系统调用&a…...
个人学习编程(3-29) leetcode刷题
最后一个单词的长度: 思路:跳过末尾的空格,可以从后向前遍历 然后再利用 while(i>0 && s[i] ! ) 可以得到字符串的长度, int lengthOfLastWord(char* s) {int length 0;int i strlen(s) - 1; //从字符串末尾开始//…...
Linux云计算SRE-第二十一周
构建单节点prometheus,部署node exporter和mongo exporter。构建kibana大盘。包含主机PU使用率,主机MEM使用率,主机网络包速度。mongo db大盘,包含节点在线状态,读操作延迟等 一、实验环境准备 - 节点信息࿱…...
无人机,云台参数设置,PWM输出控制云台俯仰
目录 1、云台与飞控的连接 2、PX4飞控控制云台,QGC地面站的设置 3、遥控器映射通道设置 4、其他设置 4.1、COM_PREARM_MODE,预解锁模式 4.2、RC9_DZ ,遥控器通道死区设置 1、云台与飞控的连接 首先确定一下,设置飞控第几路…...
EtherCAT转ProfiNet协议转换网关构建西门子PLC与海克斯康机器人的冗余通信链路
一、案例背景 某电子制造企业的5G通信模块组装线,采用西门子S7-1200PLC(ProfiNet主站)进行产线调度,而精密组装工序由3台海克斯康工业机器人(EtherCAT从站)完成。由于协议差异,机器人动作与PLC…...
Android R adb remount 调用流程
目的:调查adb remount 与adb shell进去后执行remount的差异 调试方法:添加log编译adbd,替换system\apex\com.android.adbd\bin\adbd 一、调查adb remount实现 关键代码:system\core\adb\daemon\services.cpp unique_fd daemon_service_to…...
网络中常用协议
一, TCP协议 TCP(Transmission Control Protocol,传输控制协议)是互联网核心协议之一,位于传输层,为应用层提供可靠的、面向连接的数据传输服务。 1. TCP的核心特点 特性说明面向连接通信前需通过三次握手建立连接&a…...
自动驾驶04:点云预处理03
点云组帧 感知算法人员在完成点云的运动畸变补偿后,会发现一个问题:激光雷达发送的点云数据包中的点云数量其实非常少,完全无法用来进行后续感知和定位层面的处理工作。 此时,感知算法人员就需要对这些数据包进行点云组帧的处理…...
Linux内核软中断分析
一、软中断类型 在Linux内核中,中断处理分为上半部(硬中断)和下半部。上半部负责快速响应硬件事件,而下半部用于处理耗时任务,避免阻塞系统。下半部有三种机制:软中断(Softirq)、小任…...
Linux修改默认shell为zsh
一、修改模型shell为zsh 1、检查当前使用的shell echo $SHELL 2、检查当前系统支持的shell cat /etc/shells# 输出结果显示如下: """ /bin/sh /bin/bash /usr/bin/sh /usr/bin/bash /bin/csh /bin/tcsh /usr/bin/csh /usr/bin/tcsh /usr/bin/zsh…...
k8s scheduler几种扩展方式的关系及区别
网上关于scheduler扩展介绍的文章很多,但都是东说一句西说一嘴,完全没有逻辑性,对于逻辑建构者看着很痛苦,这篇文章不会深入教你怎么扩展,而是教你几种扩展方式的关系和逻辑结构: 目前Kubernetes支持五种方…...
react 封装无缝滚动组件
记录,以防忘记 SeamlessScroll.tsx import React, { useEffect, useRef, useState } from react;interface SeamlessScrollProps {children: React.ReactNode;speed?: number; // 滚动速度,单位:像素/秒minItems?: number; // 最小项目数…...
