QT基础 - 布局管理器间隔控件

目录

一. QVBoxLayout

二. QHBoxLayout

三. QGridLayout

四. QFormLayout

五. Spacers

六.总结


一. QVBoxLayout

QVBoxLayout 主要用于将控件在垂直方向上进行排列。

它具有以下特点:

  • 可以方便地管理和组织控件,使其按照垂直顺序依次排列。
  • 能够自动根据添加的控件数量和尺寸来调整布局的整体高度。
  • 提供了简单直观的方式来构建具有垂直层次结构的界面。

通过使用 QVBoxLayout,可以让界面的布局更加清晰、有序,易于维护和扩展。它在许多 Qt 应用程序中被广泛使用,以实现各种不同的界面布局需求。

属性

  • 通常没有特定的独特属性,而是继承自父类的一些通用布局属性。

方法

  • addWidget(QWidget *widget):添加一个控件到布局中。
  • addLayout(QLayout *layout):添加一个子布局到该布局中。

实例代码

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

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

    QWidget widget;

    QVBoxLayout *layout = new QVBoxLayout(&widget);

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

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

    widget.show();

    return a.exec();
}

效果图:

二. QHBoxLayout

QHBoxLayout 是一种将控件按水平方向依次排列的布局管理器。

其主要特点包括:

  • 让控件在水平方向上整齐排列,保持水平方向的对齐和间隔。
  • 能够自动处理控件之间的间距和布局的整体宽度。
  • 提供了简洁高效的方式来构建具有水平布局结构的界面。

在实际应用中,常用于构建菜单栏、工具栏等具有水平排列控件需求的界面部分。它使得界面的水平布局更加规范和易于管理,增强了界面的可读性和易用性。例如,在一个图形编辑软件的工具栏中,各种工具按钮可以通过 QHBoxLayout 进行整齐的水平排列。

属性

  • 同 QVBoxLayout 一样,主要继承自通用布局属性。

方法

  • addWidget(QWidget *widget):向布局中添加一个控件。
  • addLayout(QLayout *layout):添加一个子布局。

实例代码

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

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

    QWidget widget;

    QHBoxLayout *layout = new QHBoxLayout(&widget);

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

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

    widget.show();

    return a.exec();
}

效果图:

三. QGridLayout

QGridLayout 是一种将控件以网格形式进行排列的布局管理器。

它具有以下显著特点:

  • 可以灵活地将控件放置在网格的特定行和列中,实现精确的布局控制。
  • 支持跨行和跨列的控件放置,以适应不同的布局需求。
  • 能够自动调整网格的尺寸和间距,以适应所包含控件的数量和大小。

这种布局方式非常适合构建具有规则表格结构或需要精确位置控制的界面。比如在一个数据录入界面中,可以将各个输入字段按照行列整齐地排列;在游戏界面中,也可以用它来布置各种游戏元素的位置。它使得界面布局更加规范、整齐,同时提供了较好的可扩展性和可维护性。

属性方面一般较少有其特有的属性。

方法主要有:

  • addWidget(QWidget *widget, int row, int col, int rowSpan = 1, int colSpan = 1):将控件添加到指定的行和列,并可指定跨的行数和列数。
  • addLayout(QLayout *layout, int row, int col):添加一个子布局到指定位置。

实例代码:

#include <QApplication>
#include <QWidget>
#include <QGridLayout>
#include <QLabel>

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

    QWidget widget;

    QGridLayout *layout = new QGridLayout(&widget);

    QLabel *label1 = new QLabel("标签 1");
    QLabel *label2 = new QLabel("标签 2");
    QLabel *label3 = new QLabel("标签 3");

    layout->addWidget(label1, 0, 0);
    layout->addWidget(label2, 0, 1);
    layout->addWidget(label3, 1, 0);

    widget.show();

    return a.exec();
}

效果图:

四. QFormLayout

QFormLayout 是 Qt中的一个布局管理器,用于在窗口中创建表单布局。它能够根据需要自动调整表单元素的大小和位置,从而创建一个漂亮且具有一致性的表单界面。

QFormLayout 按照类似 HTML 表单的方式将窗口分割成行和列,每个表单元素都放置在一个单独的行中。每一行通常包含一个标签(用于描述表单元素的用途)和一个表单控件(如文本框、下拉框等)。

QFormLayout 具有以下优点:

  • 遵守不同平台的外观和感觉准则,支持不同的标签对齐方式。
  • 支持包装长行,对于具有小显示器的设备,可以将 QFormLayout 设置为包装长行,甚至包装所有行。
  • 提供了便捷的 API,用于创建标签-字段对。

属性

  • fieldGrowthPolicy:字段的增长方式,默认值取决于小部件或应用程序样式。
  • formAlignment:在布局的几何图形中保持窗体布局内容的对齐,默认值取决于小部件或应用程序样式。
  • horizontalSpacing:并排排列的小部件之间的间距,默认情况下,如果没有显式设置值,则布局的水平间距将从父布局或父小部件的样式设置继承。
  • verticalSpacing:垂直布局的小部件之间的间距,默认情况下,如果没有显式设置值,则布局的垂直间距将从父布局或父小部件的样式设置继承。
  • labelAlignment:标签的水平对齐,默认值取决于小部件或应用程序样式。
  • rowWrapPolicy:窗体行的换行方式,默认值取决于小部件或应用程序样式。

方法

  • addRow(QWidget *label, QWidget *field):在末尾新增一行,左侧添加标签,右侧添加控件。
  • addRow(QWidget *label, QLayout *field):在末尾新增一行,左侧添加标签,右侧添加布局。
  • addRow(const QString &labelText, QWidget *field):在末尾新增一行,使用指定的标签文本创建一个QLabel对象,并将其添加到左侧,右侧添加控件。
  • addRow(const QString &labelText, QLayout *field):在末尾新增一行,使用指定的标签文本创建一个QLabel对象,并将其添加到左侧,右侧添加布局。
  • insertRow(int row, QWidget *label, QWidget *field):在指定位置插入一行,左侧添加标签,右侧添加控件。
  • insertRow(int row, QWidget *label, QLayout *field):在指定位置插入一行,左侧添加标签,右侧添加布局。
  • insertRow(int row, const QString &labelText, QWidget *field):在指定位置插入一行,使用指定的标签文本创建一个QLabel对象,并将其添加到左侧,右侧添加控件。
  • insertRow(int row, const QString &labelText, QLayout *field):在指定位置插入一行,使用指定的标签文本创建一个QLabel对象,并将其添加到左侧,右侧添加布局。
  • setRowWrapPolicy(RowWrapPolicy policy):设置换行策略。
  • setWidget(int row, ItemRole role, QWidget *widget):设置行row所对应的控件。

代码示例:

#include <QApplication>
#include <QWidget>
#include <QFormLayout>
#include <QLabel>
#include <QLineEdit>

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

    QWidget window;
    window.setWindowTitle("QFormLayout Example");

    QFormLayout *layout = new QFormLayout;

    layout->addRow(new QLabel("Name:"), new QLineEdit());
    layout->addRow(new QLabel("Age:"), new QLineEdit());

    window.setLayout(layout);

    window.show();

    return app.exec();
}

效果图:

五. Spacers

Spacers(间隔器)用于在布局中不同部件间增加间隔,以辅助解决一些布局无法完美解决的部件布局排列美观问题。Qt的spacer布局控件主要用于填充两个控件之间的间隔距离,当窗口缩放时,弹簧会把控件向两端(上下、左右)进行弹起,其弹起量随窗口的变化而变化。spacer分为vertical spacer(垂直弹簧)和horizontal spacer(水平弹簧)两种。

以下是一个使用Spacers的示例代码:

#include <QApplication>
#include <QWidget>
#include <QFormLayout>
#include <QLabel>
#include <QLineEdit>
#include <QSpacerItem>
#include<QPushButton>

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

    QWidget window;
    window.setWindowTitle("Spacers Example");

    QFormLayout *layout = new QFormLayout;

    // 添加标签和输入框
    layout->addRow(new QLabel("Name:"), new QLineEdit());
    layout->addRow(new QLabel("Age:"), new QLineEdit());

    // 添加垂直间隔
    QSpacerItem *verticalSpacer = new QSpacerItem(20, 40, QSizePolicy::Minimum, QSizePolicy::Expanding);
    layout->addItem(verticalSpacer);

    // 添加按钮
    layout->addRow(new QPushButton("OK"), new QPushButton("Cancel"));

    window.setLayout(layout);

    window.show();

    return app.exec();
}

效果图:

六.总结

  • QVBoxLayout:垂直布局管理器,用于将控件从上到下依次排列。
  • QHBoxLayout:水平布局管理器,用于将控件从左到右依次排列。
  • QGridLayout:网格布局管理器,用于将控件按照行和列的方式排列。
  • QFormLayout:表单布局管理器,用于将标签和输入控件配对排列。
  • Spacers:间隔器,用于在布局中不同部件间增加间隔.

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据治理平台报Invalid CORS request

文章目录 背景一、步骤1.修改治理conf配置文件 背景 问题描述&#xff1a;俩个域名&#xff08;都能进入同一个平台&#xff09;其中一个正常使用&#xff0c;另外一个无法进入 报错截图&#xff1a; *备注&#xff1a;本文主要从配置文件入手解决。 一、步骤 1.修改治理co…

无需付费,没有广告,驱动人生海外版本DriverTalent_Pro_v8.0.0.2单文件

如果你是一位电脑爱好者&#xff0c;你一定知道驱动程序的重要性。驱动程序是连接电脑硬件和操作系统的桥梁&#xff0c;它们可以让你的电脑运行更流畅&#xff0c;更稳定&#xff0c;更高效。但是&#xff0c;驱动程序也会随着时间的推移而过时&#xff0c;或者与新的系统不兼…

HTTP/3 协议学习

前一篇&#xff1a; HTTP/2 协议学习-CSDN博客 HTTP/3 协议介绍 HTTP/3 是互联网上用于传输超文本的协议 HTTP 的第三个主要版本。它是 HTTP/2 的后继者&#xff0c;旨在进一步提高网络性能和安全性。HTTP/3 与前两个版本的主要区别在于它使用了一个完全不同的底层传输协议—…

【linux】TCP交流状态变迁及一些函数调用

代码 登录 - Gitee.comhttps://gitee.com/r77683962/linux-6.9.0/commit/50bb00d844b9423c9bacf44d9b06604fab941686 https://gitee.com/r77683962/linux-6.9.0/raw/50bb00d844b9423c9bacf44d9b06604fab941686/dmesg_log/kern_tcp_with_state.log 从打印的日志&#xff0c;…

UE4中性能优化和检测工具

UE4中性能优化和检测工具合集 简述CPUUnreal InsightUnreal ProfilerSimpleperfAndroid StudioPerfettoXCode TimeprofilerBest Practice GPUAdreno GPUMali GPUAndroid GPU Inspector (AGI) 内存堆内存分析Android StudioLoliProfilerUE5 Memory InsightsUnity Mono 内存Memre…

QT基础 - 窗口弹窗

目录 零. 窗口简介 一. 普通窗口 二. 无边框窗口 三. 顶层窗口 四. 模态对话框 五. 非模态对话框 六. 消息对话框 七. 文件对话框 八. 颜色对话框 九. 进度对话框 十. 总结 零. 窗口简介 在 Qt中&#xff0c;普通窗口是指程序的整体界面&#xff0c;可以包含标题栏、…

低市值Pow赛道解析,探寻百倍潜力项目

随着铭文的火爆出圈&#xff0c;比特币减半的到来&#xff0c;关于Pow赛道的讨论也在变得火热&#xff0c;不少投资机构都将Pow赛道作为2024年分析的重点。Pow赛道又来已久&#xff0c;不少项目的市值都超过10亿美元&#xff0c;而对于大多数投资者来说&#xff0c;低市值高回报…

深度理解微信小程序技术架构:从前端到后台

在当今移动互联网的时代&#xff0c;微信小程序作为一种轻量级、便捷的应用形式&#xff0c;已经成为许多用户和开发者的首选。本文将深入探讨微信小程序的技术架构&#xff0c;从前端视角到后台支撑&#xff0c;为读者全面解析这一新兴应用形式的奥秘。 #### 一、微信小程序的…

SAP BC 换了logo后,其他人的logo都已经换了,但是其中有一台就是PRD 显示DEV的logo,从smw0上下载的是PRD

昨天终于发现是缓存的问题 GUI登录后 选项-本地数据-缓存 删除本地缓存文件&#xff0c;问题解决了

PEI是聚醚酰亚胺(Polyetherimide)在粘接使用时使用UV胶水的优势有哪些?要注意哪些事项?

PEI是聚醚酰亚胺&#xff08;Polyetherimide&#xff09;在粘接使用时使用UV胶水的优势有哪些&#xff1f;要注意哪些事项&#xff1f; 在使用UV胶水进行聚醚酰亚胺&#xff08;Polyetherimide&#xff0c;PEI&#xff09;粘接时&#xff0c;有一些优势和注意事项&#xff1a; …

结硬寨:联想服务器的向前之路

曾国藩曾经将自己的战略思想&#xff0c;总结为“结硬寨&#xff0c;打呆仗”。 这种稳健的策略&#xff0c;往往在真实的产业发展中能收获奇效。我们喜欢听颠覆性的产业创新&#xff0c;却往往忽视稳扎稳打&#xff0c;把每一个优势聚集起来形成整体优势&#xff0c;可能才是市…

【字符串解析】IP地址字段解析提取函数接口

在嵌入式业务逻辑中&#xff0c;我们有时需要从配置文件、串口或者服务端接收的消息数据中进行字符串解析&#xff0c;来提取需要的目标字符串字段。通常我们会调用字符串处理相关的函数&#xff0c;例如strstr&#xff0c;strchr&#xff0c;sscanf等&#xff0c;再结合指针偏…

HTML+CSS+PHP实现网页留言板功能(需要创建数据库)

话说前头&#xff0c;我这方面很菜滴。这是我网页作业的一部分。 1.body部分效果展示&#xff08;不包括footer&#xff09; 2、代码 2.1 leaving.php&#xff08;看到的网页&#xff09; <!DOCTYPE html> <html lang"en"> <head> <met…

C++中的结构体——结构体案例2

案例描述 设计一个英雄的结构体&#xff0c;包括成员姓名&#xff0c;年龄&#xff0c;性别&#xff1b;创建结构体数组&#xff0c;其中存放五名英雄 通过冒泡排序的算法&#xff0c;将数组中的英雄按照年龄升序排列&#xff0c;最终打印排序后的结果 五名英雄信息如下&…

ionic 项目通过 android studio 打开报错 capacitor.settings.gradle 文件不存在

问题出现 原因分析 在程序相应的目录上面&#xff0c;没有找到对应的配置文件&#xff0c;但是这个文件不是我们自己生成的&#xff0c;而是通过 ionic 编译之后生成。 处理方案 先执行 ionic build&#xff0c;将 ionic 项目打包出来然后执行 npx cap sync 再使用 Android…

「51媒体」电视台媒体邀约采访报道怎么做?

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 电视台作为地方主流媒体&#xff0c;对于新闻报道有着严格的选题标准和报道流程。如果您希望电视台对某个会议或活动进行报道&#xff0c;可以按这样的方法来做&#xff1a; 1.明确活动信…

Elasticsearch docker 安装及基本用法

创建网络 首先通过命令创建一个网络 docker network create es-net然后查看网络 [rootDocker ~]# docker network ls NETWORK ID NAME DRIVER SCOPE 4e315f5e3ae7 bridge bridge local a501a9f3b4ee es-net bridge local ebca66b02e8c host …

OSPF开销、协议优先级、定时器(华为)

#交换设备 OSPF开销值 如果没有定义OSPF接口的开销值&#xff0c;OSPF会根据该接口的带宽自动计算其开销值。 计算公式&#xff1a; 接口开销 带宽参考值 / 接口带宽 &#xff08;取整数部分&#xff0c;结果小于1时取1&#xff09;通过改变带宽参考值可以间接改变接口的开…

Vue10-实战快速上手

实战快速上手 我们采用实战教学模式并结合ElementUI组件库&#xff0c;将所需知识点应用到实际中&#xff0c;以最快速度带领大家掌握Vue的使用&#xff1b; 1、创建工程 注意&#xff1a;命令行都要使用管理员模式运行 1、创建一个名为hello-vue的工程vue init webpack hel…

Transformer预测 | 基于Transformer的锂电池寿命预测(Pytorch,CALCE数据集)

文章目录 文章概述模型描述程序设计参考资料文章概述 Pytorch实现基于Transformer 的锂电池寿命预测,环境为pytorch 1.8.0,pandas 0.24.2 随着充放电次数的增加,锂电池的性能逐渐下降。电池的性能可以用容量来表示,故寿命预测 (RUL) 可以定义如下: SOH(t)=CtC0100%, 其中,…