1.6 窗口布局
1. 布局的样式为什么要布局:1. 布局之后窗口的排列是有序的2. 布局之后窗口的大小发生变化, 控件的大小也会对应变化3. 如果不对控件布局, 窗口显示出来之后有些控件的看不到的布局可以嵌套使用Qt窗口布局是指将多个子窗口按照某种排列方式将其全部展示到对应的父窗口中的一种处理方式。在Qt中常用的布局样式有三种分别是布局样式描述行数列数水平布局布局中的所有的控件水平排列1 行N 列 (N1)垂直布局布局中的所有的控件垂直排列N 行 (N1)1 列网格栅格布局布局中的所有的控件垂直 水平排列N 行N 列 (N1)有问有答:1. 控件的位置可以通过坐标指定, 为什么还要使用布局?- 坐标指定的位置是固定的, 当窗口大小发生改变, 子窗口位置不会变化- 使用坐标指定子窗口位置, 这个控件可能会被其他控件覆盖导致无法显示出来- 使用布局的方式可以完美解决以上的问题- 一般在制作窗口的过程中都是给子控件进行布局, 而不是指定固定坐标位置2. 布局有局限性吗, 窗口结构复杂如何解决呢?- 没有局限性, 并且布局的使用是非常灵活的- 各种布局是可以无限嵌套使用的, 这样就可以制作成非常复杂的窗口了- 思路是这样的: 给窗口设置布局, 在布局中添加窗口, 子窗口中再设置布局,在子窗口布局中再次添加窗口, ......(无限循环)2. 在UI窗口中设置布局在UI窗口中进行布局的设置一共有两种处理方式, 下面依次为大家进行讲解2.1 方式1第一种方式是使用Qt提供的布局, 从工具箱中找到相关的布局, 然后将其拖拽到UI窗口中将相应的控件放入到布局对应的红色框内部, 这些控件就按照布局的样式自动排列到一起了是不是很方便赶紧自己操作起来感受一下吧。除此之外, 我们也可以修改当前布局, 需要先选中当前布局, 然后鼠标右键, 在右键菜单中找布局在其子菜单项中选择其他布局即可2.2 方式2第二种方式是直接在父窗口中对子部件进行布局, 如果窗口结构很复杂需要嵌套, 那么就需要先将这些子部件放到一个容器类型的窗口中, 然后再对这个容器类型的窗口进行布局操作。步骤听起来布局复杂 下边依次为大家演示一下。首先需要从工具栏中拖拽一个容器类型的窗口到UI界面上一般首选QWidget原因是简单, 并且窗口显示之后看不到任何痕迹将要布局的子控件放到这个QWidget中控件拖放过程中无需在意位置和是否对齐, 没有布局之前显示杂乱无序是正常现象。对这个QWidget进行布局首选选中这个存储子部件的父容器窗口, 然后鼠标右键, 在右键菜单中找布局, 通过其子菜单就可以选择需要的布局方式了。布局之后所有的子部件就能够按照对应样式排列了(如果是网格布局, 有时候需要使用鼠标调节一下)也可以通过窗口上方工具栏提供的布局按钮进行窗口布局2.3 弹簧的使用在进行窗口布局的时候为了让界面看起来更加美观, 需要调整控件的位置, 比如: 靠左, 靠右, 居中, 又或者我们需要调节两个控件之间的距离, 以上这些需求使用弹簧都是可以实现的。弹簧的样式有两种水平弹簧: 在水平方向起作用垂直弹簧: 在垂直方向起作用弹簧也有对应的属性可以设置, 具体属性如下图所示:关于弹簧的sizeType属性, 有很多选项, 一般常用的只有两个:Fixed: 得到一个固定大小的弹簧Expanding: 得到一个可伸缩的弹簧, 默认弹簧撑到最大2.4 布局属性设置当我们给窗口设置了布局之后, 选中当前窗口, 就可以看到在其对应的属性窗口中除了有窗口属性, 还有一个布局属性, 下面给大家介绍一下这些属性:我们通过设置布局上下左右的边距, 或者是控件之间的距离也可以使界面看起来更加美观。2.5 布局的注意事项通过UI编辑窗口的树状列表我们可以对所有窗口的布局进行检查, 如果发现某个窗口没有布局, 一定要对其进行设置, 如果某个窗口没有进行布局, 那么当这个窗口显示出来之后里边的子部件就可能无法被显示出来, 尤其是初学者一定要注意这个问题。如果想要自己制作出一个比较美观的窗口需要反复对细节进行调节(修改布局的属性)并且要借助弹簧, 这样才能实现我们想要的效果。下面是一个简单的登录窗口 大家可以试着自己搞一搞3. 通过API设置布局在QT中, 布局也有对应的类, 布局类之间的关系如下:在上图中的布局类虽然很多, 常用的布局类有三个, 就前边给大家介绍的三种布局, 对应关系如下:虽然一般我们不使用这些布局类对窗口进行布局, 但是在这里还是给大家介绍一下这些类中常用的一些API函数3.1 QLayout// 在布局最后面添加一个窗口 void QLayout::addWidget(QWidget *w); // 将某个窗口对象从布局中移除, 窗口对象如果不再使用需要自己析构 void QLayout::removeWidget(QWidget *widget); // 设置布局的四个边界大小, 即: 左、上、右和下的边距。 void QLayout::setContentsMargins(int left, int top, int right, int bottom); // 设置布局中各个窗口之间的间隙大小 void setSpacing(int);3.2 QHBoxLayout这个类中的常用API都是从基类继承过来的, 关于其使用, 实例代码如下:// 创建符窗口对象 QWidget *window new QWidget; // 创建若干个子窗口对象 QPushButton *button1 new QPushButton(One); QPushButton *button2 new QPushButton(Two); QPushButton *button3 new QPushButton(Three); QPushButton *button4 new QPushButton(Four); QPushButton *button5 new QPushButton(Five); // 创建水平布局对象 QHBoxLayout *layout new QHBoxLayout; // 将子窗口添加到布局中 layout-addWidget(button1); layout-addWidget(button2); layout-addWidget(button3); layout-addWidget(button4); layout-addWidget(button5); // 将水平布局设置给父窗口对象 window-setLayout(layout); // 显示父窗口 window-show();代码效果展示:3.3 QVBoxLayout这个类中的常用API都是从基类继承过来的, 关于其使用, 实例代码如下:// 创建符窗口对象 QWidget *window new QWidget; // 创建若干个子窗口对象 QPushButton *button1 new QPushButton(One); QPushButton *button2 new QPushButton(Two); QPushButton *button3 new QPushButton(Three); QPushButton *button4 new QPushButton(Four); QPushButton *button5 new QPushButton(Five); // 创建垂直布局对象 QVBoxLayout *layout new QVBoxLayout; // 将子窗口添加到布局中 layout-addWidget(button1); layout-addWidget(button2); layout-addWidget(button3); layout-addWidget(button4); layout-addWidget(button5); // 将水平布局设置给父窗口对象 window-setLayout(layout); // 显示父窗口 window-show();代码效果展示:3.4 QGridLayout// 构造函数 QGridLayout::QGridLayout(); QGridLayout::QGridLayout(QWidget *parent); // 添加窗口对象到网格布局中 /* 参数: - widget: 添加到布局中的窗口对象 - row: 添加到布局中的窗口对象位于第几行 (从0开始) - column: 添加到布局中的窗口对象位于第几列 (从0开始) - alignment: 窗口在布局中的对齐方式, 没有特殊需求使用默认值即可 */ void QGridLayout::addWidget( QWidget *widget, int row, int column, Qt::Alignment alignment Qt::Alignment()); /* 参数: - widget: 添加到布局中的窗口对象 - fromRow: 添加到布局中的窗口对象位于第几行 (从0开始) - fromColumn: 添加到布局中的窗口对象位于第几列 (从0开始) - rowSpan: 添加的窗口从 fromRow 行开始跨越的行数 - columnSpan: 添加的窗口从 fromColumn 列开始跨越的列数 - alignment: 窗口在布局中的对齐方式, 没有特殊需求使用默认值即可 */ void QGridLayout::addWidget( QWidget *widget, int fromRow, int fromColumn, int rowSpan, int columnSpan, Qt::Alignment alignment Qt::Alignment()); // 设置 column 对应的列的最新宽度, 单位: 像素 void QGridLayout::setColumnMinimumWidth(int column, int minSize); // 设置布局中水平方向窗口之间间隔的宽度 void QGridLayout::setHorizontalSpacing(int spacing); // 设置布局中垂直方向窗口之间间隔的宽度 void QGridLayout::setVerticalSpacing(int spacing);测试代码如下:// 创建父窗口对象 QWidget* window new QWidget; // 创建子窗口对象 QPushButton *button1 new QPushButton(One); QPushButton *button2 new QPushButton(Two); QPushButton *button3 new QPushButton(Three); QPushButton *button4 new QPushButton(Four); QPushButton *button5 new QPushButton(Five); QPushButton *button6 new QPushButton(Six); // 多行文本编辑框 QTextEdit* txedit new QTextEdit; txedit-setText(我占用了两行两列的空间哦。); QGridLayout* layout new QGridLayout; // 按钮起始位置: 第1行, 第1列, 该按钮占用空间情况为1行1列 layout-addWidget(button1, 0, 0); // 按钮起始位置: 第1行, 第2列, 该按钮占用空间情况为1行1列 layout-addWidget(button2, 0, 1); // 按钮起始位置: 第1行, 第3列, 该按钮占用空间情况为1行1列 layout-addWidget(button3, 0, 2); // 编辑框起始位置: 第2行, 第1列, 该按钮占用空间情况为2行2列 layout-addWidget(txedit, 1, 0, 2, 2); // 按钮起始位置: 第2行, 第3列, 该按钮占用空间情况为1行1列 layout-addWidget(button4, 1, 2); // 按钮起始位置: 第3行, 第3列, 该按钮占用空间情况为1行1列 layout-addWidget(button5, 2, 2); // 按钮起始位置: 第4行, 第1列, 该按钮占用空间情况为1行3列 layout-addWidget(button6, 3, 0, 1, 3); // 网格布局设置给父窗口对象 window-setLayout(layout); // 显示父窗口 window-show();测试代码效果展示:笔记1.窗口布局Layout不布局可能带来的后果可以将水平布局调整为垂直或者网格类型的布局使用QWidget窗口作为容器对里面的控件进行布局上面有一些快捷键第一个是水平布局第二个是垂直布局六个点是表格布局九个点是网格布局倒数第二个是打破布局布局可以嵌套布局前面有水平或者垂直的图标是布局没有的话右下角有个×窗口里的控件会跟随窗口的拉伸进行相应的缩放2.窗口布局举例-制作一个登录界面登录需要显示在主窗口之前因此不能直接在程序中直接修改主窗口需要在主窗口显示之前额外添加一个带ui界面的窗口制作5个水平布局并把这5个水平布局放到一个垂直布局中文本用label单行的文本编辑框用Line Edit新建一个widget把用户名和文本框一起选中放进窗口中设置水平布局密码的控件也如此操作把这两部分选中再放到一个widget窗口中做一个网格布局单选按钮水平布局复选框CheckBox给dialog垂直布局方法一对登录进行居中显示弹簧给弹簧设置固定

相关新闻

布尔盲注实战解析:从原理到自动化工具Sqlmap应用

布尔盲注实战解析:从原理到自动化工具Sqlmap应用

1. 从一道CTF题看布尔盲注的实战精髓 最近在带新人入门网络安全,发现很多朋友对SQL注入的理解还停留在“万能密码”或者联合查询的层面,一旦遇到没有明确回显的“盲注”场景就有点懵。正好,之前带大家复盘过一道非常经典的Bugku平台上的SQL盲…

2026/8/15 2:04:05 阅读更多 →
2026北京本土GEO优化服务商调研分析与选型避坑指南

2026北京本土GEO优化服务商调研分析与选型避坑指南

2026北京本土GEO优化服务商调研分析与选型避坑指南一、研究前言:AI搜索迭代下的北京GEO产业新格局2026年,生成式人工智能的商用落地进入深度普及阶段,大众用户获取商业信息、解答行业疑问、筛选合作品牌的主要入口,已从传统网页搜…

2026/8/15 2:04:05 阅读更多 →
告别配置劝退:四层心法让新工具从“听说”到“用上”

告别配置劝退:四层心法让新工具从“听说”到“用上”

你肯定听说过 Codex,也大概知道它能做什么——自动补全代码、生成函数、甚至根据注释写代码。但每次想动手试试,是不是总卡在第一步?不是环境变量没配好,就是依赖冲突,或者某个神秘的错误弹窗让你瞬间失去耐心。“配置…

2026/8/15 2:04:05 阅读更多 →

最新新闻

数学建模竞赛“穿越沙漠”解题:MDP框架、动态规划与状态空间优化实战

数学建模竞赛“穿越沙漠”解题:MDP框架、动态规划与状态空间优化实战

1. 赛题回顾与核心挑战解析2020年高教社杯全国大学生数学建模竞赛的B题,题目是“穿越沙漠”。这道题在当时,甚至在赛后很长一段时间里,都成为了一个经典案例,被无数参赛者和指导老师反复咀嚼、分析。它之所以经典,不在…

2026/8/15 2:48:16 阅读更多 →
风扇狂转还掉帧?OmenSuperHub 免费接管暗影精灵散热与功耗,内存只占官方零头

风扇狂转还掉帧?OmenSuperHub 免费接管暗影精灵散热与功耗,内存只占官方零头

风扇狂转还掉帧?OmenSuperHub 免费接管暗影精灵散热与功耗,内存只占官方零头 【免费下载链接】OmenSuperHub Control Omen laptop performance, fan speeds, and keyboard lighting, and unlock power limits. 项目地址: https://gitcode.com/gh_mirro…

2026/8/15 2:48:16 阅读更多 →
零基础入门CTF:100集系统教程带你掌握网络安全攻防实战

零基础入门CTF:100集系统教程带你掌握网络安全攻防实战

这次我们来看一套完整的CTF(Capture The Flag,夺旗赛)入门教程。这套教程号称“100集完整版”,目标是让零基础的小白也能系统性地学习网络安全攻防技术,从入门到能够实际参与CTF比赛。对于想进入网络安全领域&#xff…

2026/8/15 2:48:16 阅读更多 →
全国大学生数学竞赛B类备赛指南:核心题型解析与解题思维训练

全国大学生数学竞赛B类备赛指南:核心题型解析与解题思维训练

1. 项目概述:一份竞赛试卷的深度价值最近在整理资料时,翻出了去年第十五届全国大学生数学竞赛(数学B类)的预赛试卷和当时自己做的详细解答。这份试卷,对于非数学专业但对数学有较高要求的理工科学生来说,其…

2026/8/15 2:48:16 阅读更多 →
数学建模竞赛:新农科背景下跨学科人才培养的实践路径

数学建模竞赛:新农科背景下跨学科人才培养的实践路径

1. 项目概述:从一则喜报看学科竞赛的深层价值看到“农大有理|热烈祝贺我院学子在第十二届APMCM亚太地区大学生数学建模竞赛中喜获佳绩”这个标题,很多人的第一反应可能是“哦,又有一所大学的学生拿奖了”。但作为一名长期关注高等…

2026/8/15 2:48:16 阅读更多 →
APMCM数学建模竞赛:从组队备赛到四天极限实战全解析

APMCM数学建模竞赛:从组队备赛到四天极限实战全解析

1. 项目概述:从一则喜讯看国际学科竞赛的实战价值看到“我校在第九届APMCM国际大赛中喜获大奖”这样的标题,很多人的第一反应可能是“哦,又拿奖了”,然后快速划过。但作为一名长期关注并指导学生参与各类国际性学科竞赛的从业者&a…

2026/8/15 2:47:16 阅读更多 →

日新闻

内景 空间站内部 中国空间站 太空 内仓

内景 空间站内部 中国空间站 太空 内仓

本项目为前几天收费帮学妹做的一个项目,在工作环境中基本使用不到,但是很多学校把这个当作编程入门的项目来做,故分享出本项目供初学者参考。 一、项目描述 空间站内部 中国空间站 太空 内仓 地址:本地PC端运行(或Web…

2026/8/15 0:00:30 阅读更多 →
重新定义数据接口:3个突破性场景让通达信数据读取更智能

重新定义数据接口:3个突破性场景让通达信数据读取更智能

重新定义数据接口:3个突破性场景让通达信数据读取更智能 【免费下载链接】mootdx 通达信数据读取的一个简便使用封装 项目地址: https://gitcode.com/GitHub_Trending/mo/mootdx 当我们面对海量金融数据时,传统的数据获取方式往往让我们陷入困境—…

2026/8/15 0:00:30 阅读更多 →
一文读懂快消WMS怎么选?2026年国内外10大主流WMS品牌盘点

一文读懂快消WMS怎么选?2026年国内外10大主流WMS品牌盘点

快消品(FMCG)是流通速度较快、竞争较为激烈的行业之一。一瓶饮料从出厂到消费者手中,往往只有几十天甚至几天的周转窗口。这决定了快消行业的仓储管理系统(WMS)与制造业、电商行业存在明显区别:它不仅需要管…

2026/8/15 0:02:30 阅读更多 →

周新闻

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁 【免费下载链接】baidupankey 在线查询网盘提取码(维护中 rm repo) 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 你是否曾经在深夜寻找一份重要资料&#x…

2026/8/13 2:38:34 阅读更多 →
如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南 【免费下载链接】chinese_license_plate_generator 中国车牌生成器 项目地址: https://gitcode.com/gh_mirrors/ch/chinese_license_plate_generator 中国车牌生成器是一个基于Python的开源项目&#xff0c…

2026/8/13 10:41:52 阅读更多 →
收藏!小白程序员轻松入门大模型,从Harness工程开始实践

收藏!小白程序员轻松入门大模型,从Harness工程开始实践

文章强调学习大模型不应只关注模型本身,而应重视模型外的系统搭建,即Harness。提出AgentModelHarness的实用公式,详细介绍Harness的四个层次:持久化层、执行层、控制层和观察与验证层。文章还探讨了上下文工程、工具设计、AGENTS.…

2026/8/13 10:41:51 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/14 13:40:53 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/14 14:06:45 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/15 2:35:29 阅读更多 →