QT 开发日志:QT 布局管理 —— 如何使用布局器组织 UI 元素

news2024/9/30 6:04:34

在这里插入图片描述

🎬 鸽芷咕:个人主页

 🔥 个人专栏: 《C++干货基地》《粉丝福利》

⛺️生活的理想,就是为了理想的生活!

专栏介绍

在软件开发和日常使用中,BUG是不可避免的。本专栏致力于为广大开发者和技术爱好者提供一个关于BUG解决的经验分享和知识交流的平台。我们将深入探讨各类BUG的成因、解决方法和预防措施,助你轻松应对编程中的挑战。

  • 博主简介

博主致力于嵌入式、Python、人工智能、C/C++领域和各种前沿技术的优质博客分享,用最优质的内容带来最舒适的阅读体验!在博客领域获得 C/C++领域优质、CSDN年度征文第一、掘金2023年人气作者、华为云享专家、支付宝开放社区优质博主等头衔。

  • 个人社区 & 个人社群 加入点击 即可

加入个人社群即可获得博主精心整理的账号运营技巧,对于技术博主该如何打造自己的个人IP。带你快速找你你自己的账号定位为你扫清一切账号运营和优质内容输出问题。


文章目录

  • 专栏介绍
    • 一、为什么需要布局管理
    • 二、Qt 中的布局器类型
      • 1. QHBoxLayout(水平布局)
      • 2. QVBoxLayout(垂直布局)
      • 3. QGridLayout(网格布局)
      • 4. QFormLayout(表单布局)
    • 三、如何使用布局器组织 UI 元素
      • 1. 创建布局器对象
      • 2. 添加 UI 元素到布局器
      • 3. 设置布局器到容器窗口
    • 四、布局器的高级用法
      • 1. 嵌套布局器
      • 2. 布局器的间距和边距
      • 3. 布局器的拉伸因子
    • 五、总结

一、为什么需要布局管理

在软件开发过程中,我们的应用程序可能会在不同的设备上运行,这些设备具有不同的屏幕尺寸和分辨率。如果没有布局管理,我们将不得不手动调整每个 UI 元素的位置和大小,以适应不同的屏幕环境。这不仅是一项繁琐的工作,而且容易出现错误。

布局管理可以自动处理 UI 元素的排列和调整,使得我们的界面在不同的环境下都能保持良好的布局。它还可以提高开发效率,减少维护成本,并且使得界面更加美观和易于使用。

二、Qt 中的布局器类型

Qt 提供了几种不同类型的布局器,每种布局器都有其特定的用途和特点。以下是 Qt 中常见的布局器类型:

1. QHBoxLayout(水平布局)

  • 用途:将 UI 元素水平排列在一行中。当窗口大小发生变化时,布局器会自动调整 UI 元素的宽度,以保持它们在水平方向上的对齐。
  • 示例:假设我们正在开发一个简单的登录界面,其中包含两个输入框(用户名和密码)和一个登录按钮。我们可以使用 QHBoxLayout 将这三个 UI 元素水平排列在一行中,使得它们在界面中更加整齐和美观。
#include <QApplication>
#include <QWidget>
#include <QHBoxLayout>
#include <QLineEdit>
#include <QPushButton>

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    QWidget window;
    QHBoxLayout *layout = new QHBoxLayout(&window);

    QLineEdit *usernameEdit = new QLineEdit();
    QLineEdit *passwordEdit = new QLineEdit();
    QPushButton *loginButton = new QPushButton("Login");

    layout->addWidget(usernameEdit);
    layout->addWidget(passwordEdit);
    layout->addWidget(loginButton);

    window.show();

    return app.exec();
}

2. QVBoxLayout(垂直布局)

  • 用途:将 UI 元素垂直排列在一列中。与 QHBoxLayout 类似,当窗口大小发生变化时,布局器会自动调整 UI 元素的高度,以保持它们在垂直方向上的对齐。
  • 示例:如果我们要创建一个设置界面,其中包含多个选项卡和一个确定按钮,我们可以使用 QVBoxLayout 将这些 UI 元素垂直排列在一列中。
#include <QApplication>
#include <QWidget>
#include <QVBoxLayout>
#include <QTabWidget>
#include <QPushButton>

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    QWidget window;
    QVBoxLayout *layout = new QVBoxLayout(&window);

    QTabWidget *tabWidget = new QTabWidget();
    QPushButton *okButton = new QPushButton("OK");

    layout->addWidget(tabWidget);
    layout->addWidget(okButton);

    window.show();

    return app.exec();
}

3. QGridLayout(网格布局)

  • 用途:将 UI 元素排列在一个二维网格中。我们可以指定每个 UI 元素在网格中的位置和大小,使得界面更加整齐和规范。
  • 示例:在一个表格编辑界面中,我们可以使用 QGridLayout 将表格、工具栏和状态栏等 UI 元素排列在一个网格中,以实现更好的布局效果。
#include <QApplication>
#include <QWidget>
#include <QGridLayout>
#include <QTableWidget>
#include <QToolBar>
#include <QStatusBar>

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    QWidget window;
    QGridLayout *layout = new QGridLayout(&window);

    QTableWidget *tableWidget = new QTableWidget();
    QToolBar *toolBar = new QToolBar();
    QStatusBar *statusBar = new QStatusBar();

    layout->addWidget(tableWidget, 0, 0, 1, 3);
    layout->addWidget(toolBar, 1, 0);
    layout->addWidget(statusBar, 2, 0, 1, 3);

    window.show();

    return app.exec();
}

4. QFormLayout(表单布局)

  • 用途:用于创建表单式的界面布局,通常用于输入和编辑数据。它将标签和对应的输入字段成对地排列在一行中,使得界面更加清晰和易于使用。
  • 示例:在一个用户注册界面中,我们可以使用 QFormLayout 将用户名、密码、电子邮件等输入字段和对应的标签排列在一个表单中。
#include <QApplication>
#include <QWidget>
#include <QFormLayout>
#include <QLabel>
#include <QLineEdit>

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    QWidget window;
    QFormLayout *layout = new QFormLayout(&window);

    QLabel *usernameLabel = new QLabel("Username:");
    QLineEdit *usernameEdit = new QLineEdit();
    QLabel *passwordLabel = new QLabel("Password:");
    QLineEdit *passwordEdit = new QLineEdit();
    QLabel *emailLabel = new QLabel("Email:");
    QLineEdit *emailEdit = new QLineEdit();

    layout->addRow(usernameLabel, usernameEdit);
    layout->addRow(passwordLabel, passwordEdit);
    layout->addRow(emailLabel, emailEdit);

    window.show();

    return app.exec();
}

三、如何使用布局器组织 UI 元素

1. 创建布局器对象

首先,我们需要创建一个布局器对象。可以根据需要选择合适的布局器类型,如 QHBoxLayout、QVBoxLayout、QGridLayout 或 QFormLayout。

QHBoxLayout *layout = new QHBoxLayout();

2. 添加 UI 元素到布局器

创建好布局器对象后,我们可以将 UI 元素添加到布局器中。可以使用布局器的addWidget()方法将单个 UI 元素添加到布局器中,也可以使用addLayout()方法将另一个布局器添加到当前布局器中。

QPushButton *button = new QPushButton("Click me");
layout->addWidget(button);

3. 设置布局器到容器窗口

最后,我们需要将布局器设置到一个容器窗口中,以便布局器能够管理容器窗口中的 UI 元素。可以使用容器窗口的setLayout()方法将布局器设置到容器窗口中。

QWidget window;
window.setLayout(layout);

四、布局器的高级用法

1. 嵌套布局器

我们可以使用嵌套布局器来实现更加复杂的界面布局。例如,我们可以在一个垂直布局中嵌套一个水平布局,或者在一个网格布局中嵌套一个表单布局。

#include <QApplication>
#include <QWidget>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QPushButton>

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    QWidget window;
    QVBoxLayout *mainLayout = new QVBoxLayout(&window);

    QHBoxLayout *buttonLayout = new QHBoxLayout();
    QPushButton *button1 = new QPushButton("Button 1");
    QPushButton *button2 = new QPushButton("Button 2");
    buttonLayout->addWidget(button1);
    buttonLayout->addWidget(button2);

    mainLayout->addLayout(buttonLayout);

    window.show();

    return app.exec();
}

2. 布局器的间距和边距

布局器可以设置间距和边距,以控制 UI 元素之间的距离和容器窗口的边缘距离。可以使用布局器的setSpacing()方法设置间距,使用setContentsMargins()方法设置边距。

#include <QApplication>
#include <QWidget>
#include <QVBoxLayout>
#include <QPushButton>

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    QWidget window;
    QVBoxLayout *layout = new QVBoxLayout(&window);

    QPushButton *button1 = new QPushButton("Button 1");
    QPushButton *button2 = new QPushButton("Button 2");

    layout->addWidget(button1);
    layout->addWidget(button2);

    layout->setSpacing(10);
    layout->setContentsMargins(10, 10, 10, 10);

    window.show();

    return app.exec();
}

3. 布局器的拉伸因子

布局器可以设置拉伸因子,以控制 UI 元素在布局中的拉伸比例。当窗口大小发生变化时,具有较大拉伸因子的 UI 元素将占用更多的空间。

#include <QApplication>
#include <QWidget>
#include <QVBoxLayout>
#include <QPushButton>

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    QWidget window;
    QVBoxLayout *layout = new QVBoxLayout(&window);

    QPushButton *button1 = new QPushButton("Button 1");
    QPushButton *button2 = new QPushButton("Button 2");

    layout->addWidget(button1);
    layout->addWidget(button2);

    layout->setStretchFactor(button1, 1);
    layout->setStretchFactor(button2, 2);

    window.show();

    return app.exec();
}

五、总结

Qt 布局管理是构建用户界面的重要工具,它可以帮助我们自动调整和排列 UI 元素,确保界面在不同的环境下都能保持良好的布局。通过使用不同类型的布局器,我们可以实现各种复杂的界面布局。在使用布局器时,我们可以根据需要设置间距、边距和拉伸因子等属性,以进一步优化界面的布局效果。希望本文能够帮助你更好地理解和使用 Qt 布局管理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2178868.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

探索高效免费的PDF转Word工具,开启便捷办公之旅

无论是为了方便对文档内容进行编辑、修改&#xff0c;还是为了更好地适应不同的工作和学习场景&#xff0c;将 PDF 文档转换为可编辑的 Word 格式都具有重要意义。今天我就分享几款pdf转换成word免费版工具来解决大家的困扰。 1.Foxit PDF转换大师 链接一下>>https://w…

系统架构设计师-知识产权与标准化

目录 一、保护范围与对象 二、保护期限 三、知识产权人确定 四、侵权判断 五、标准化 一、保护范围与对象 知识产权是权利人依法就下列课题享有的专有权利&#xff1a; &#xff08;一&#xff09;作品&#xff08;著作&#xff09; &#xff08;二&#xff09;发明、实用…

通过OpenScada在ARMxy边缘计算网关上实现远程监控

随着工业互联网技术的发展&#xff0c;边缘计算逐渐成为连接物理世界与数字世界的桥梁。在众多边缘计算设备中&#xff0c;ARMxy BL340系列因其强大的性能、灵活的I/O配置及广泛的适用性&#xff0c;成为了工业控制、物联网关等领域的优选方案之一。 一、ARMxy BL340系列概述 …

波导阵列天线 馈电网络2 一种使用有着多反射零点的T型结的毫米波48%带宽高增益3D打印天线阵列

摘要&#xff1a; 一种设计毫米波宽带大规模天线阵列的创新方法被提出了&#xff0c;其使用有着多个反射零点的波导T型结来构建一个H型全公共馈网。通过联合优化反射零点的性质&#xff0c;可以减弱馈网中不期望的小反射的同相叠加&#xff0c;因此提升阵列的带宽。调研了合成有…

04 B-树

目录 常见的搜索结构B-树概念B-树的插入分析B-树的插入实现B树和B*树B-树的应用 1. 常见的搜索结构 种类数据格式时间复杂度顺序查找无要求O(N)二分查找有序O( l o g 2 N log_2N log2​N)二分搜索树无要求O(N)二叉平衡树无要求O( l o g 2 N log_2N log2​N)哈希无要求O(1) 以…

[网络]NAT、代理服务、内网穿透、内网打洞

目录 一、NAT 1.1 NAT 技术背景 1.2 NAT IP 转换过程 1.3 NAPT&#xff08;Network Address Port Translation&#xff09; 1.地址转换表 2. NAPT&#xff08;网络地址端口转换Network Address Port Translation&#xff09; 3. NAT技术的缺陷 二、代理服务器 2.1 正向…

麒麟桌面系统安装和配置Node.js

1.官网下载tar.xz文件 Node.js — 在任何地方运行 JavaScript 2.解压 可以双击直接窗口解压&#xff0c;也可以使用如下命令进行解压&#xff1a; xz -d xxx.tar.xz&#xff1b; tar -xvf xxx.tar 可以解压到usr目录或者其他目录。 3. 配置环境 解压完毕后&#xff0c…

Redis中数据类型的使用(hash和list)

&#xff08;一&#xff09;hash哈希 我们知道redis中的数据都是以键值对的方式存储的&#xff0c;key全部都是string类型&#xff0c;而value可以是不同的数据结构&#xff0c;其中就包括hash&#xff0c;也就是说&#xff0c;key这一层组织完成后到了value仍然是hash 1.Hash…

企业级移动门户的多样化选择:为数字化转型赋能

在当今数字化转型的浪潮中&#xff0c;企业级移动门户&#xff08;Enterprise Mobile Portal&#xff09;被广泛应用于企业的日常运营中。它们为企业提供了一个集中、统一的移动应用与数据访问平台&#xff0c;帮助提升工作效率、增强实时沟通并改善员工体验。随着企业对灵活性…

Qt --- 系统相关---事件、文件操作、多线程编程、网络编程、多媒体

虽然Qt是跨平台的C开发框架&#xff0c;Qt的很多能力其实是操作系统提供的。只不过Qt封装了系统API。程序是运行在操作系统上的&#xff0c;需要系统给我们提供支撑。 事件、文件操作、多线程编程、网络编程、多媒体&#xff08;音频、视频&#xff09;。 一、事件 信号槽&a…

数学期望专题

9.29 - 10.6 更新时间约持续一周 优惠券 Coupons 题目链接&#xff1a;优惠券 Coupons 假设我们某个情况下&#xff0c;我们已经有了 k 种图案&#xff0c;在这个条件下&#xff0c;获得一个新图案需要 天&#xff0c;那我们要求的就是 。由于已经有了 k 种图案&#xff0c…

【热门主题】000002 案例 JavaScript网页设计案例

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 【热…

技术速递|Java on Azure Tooling 8月更新 - Java 体验在 Azure 容器应用程序正式发布

作者&#xff1a;Jialuo Gan 排版&#xff1a;Alan Wang 大家好&#xff0c;欢迎阅读 Java on Azure 开发者工具8月份更新。在本次更新中&#xff0c;我们将介绍在 IntelliJ IDEA 中 Azure Toolkit 对 Azure App Service 提供托管身份支持&#xff08;Managed Identity&#xf…

AIGC教程:如何用Stable Diffusion+ControlNet做角色设计?

前言 对于生成型AI的画图能力&#xff0c;尤其是AI画美女的能力&#xff0c;相信同行们已经有了充分的了解。然而&#xff0c;对于游戏开发者而言&#xff0c;仅仅是漂亮的二维图片实际上很难直接用于角色设计&#xff0c;因为&#xff0c;除了设计风格之外&#xff0c;角色设…

class 029 重要排序算法的总结

这篇文章是看了“左程云”老师在b站上的讲解之后写的, 自己感觉已经能理解了, 所以就将整个过程写下来了。 这个是“左程云”老师个人空间的b站的链接, 数据结构与算法讲的很好很好, 希望大家可以多多支持左程云老师, 真心推荐. https://space.bilibili.com/8888480?spm_id_f…

Springboot+PostgreSQL+MybatisPlus存储JSON或List、数组(Array)数据

项目架构 SpringbootPostgreSQLMybatisPlus 从Mongodb转过来的项目&#xff0c;有存储json数据的需求&#xff0c;但是在mybatis-plus上会出点问题 报错&#xff1a; Error updating database. Cause: org.postgresql.util.PSQLException 字段 “” 的类型为 jsonb, 但表达式的…

Junit和枚举ENUM

断言机制&#xff0c;JAVA中的断言机制是一种用于检查程序中某个条件是否为真的机制。它可以在程序运行时检查某个条件是否满足&#xff0c;如果不满足则会抛出AssertionError异常。 在java中,断言机制默认是关闭的。所以会输出u。 断言机制只是为了用来吃调试程序的&#xff0…

【设计模式-中介者模式】

定义 中介者模式&#xff08;Mediator Pattern&#xff09;是一种行为设计模式&#xff0c;通过引入一个中介者对象&#xff0c;来降低多个对象之间的直接交互&#xff0c;从而减少它们之间的耦合度。中介者充当不同对象之间的协调者&#xff0c;使得对象之间的通信变得简单且…

fiddler抓包13_响应后断点 - 篡改响应

课程大纲 原理 响应后断点&#xff08;After Response Breakpoint&#xff09;&#xff1a;Fiddler拦截、篡改服务器返回的响应&#xff0c;再返回给客户端。 应用场景 1.分析服务器响应数据 2.测试前端对特定返回的处理、展示 3.模拟网络中断、不稳定场景 单个断点 VS 全局…

信息安全数学基础(22)素数模的同余式

前言 信息安全数学基础中的素数模的同余式是数论中的一个重要概念&#xff0c;它涉及到了素数、模运算以及同余关系等多个方面。 一、基本概念 素数&#xff1a;素数是指只能被1和它本身整除的大于1的自然数。素数在密码学中有着广泛的应用&#xff0c;如RSA加密算法就依赖于大…