【Qt笔记】Qt中各个布局详解

news2024/11/15 2:17:39

 

目录

引言

一、QHBoxLayout(水平布局)

1.1 基础特性

1.2 代码示例

1.3 效果展示

二、QVBoxLayout(垂直布局)

2.1 基础特性

2.2 代码示例

2.3 效果展示

三、QGridLayout(网格布局) 

3.1 基础特性

3.2 代码示例

3.3 效果展示

四、QFormLayout(表单布局) 

4.1 基础特性

4.2 代码示例

4.3 效果展示

五、QStackedLayout(堆叠布局) 

5.1 基础特性

5.2 代码示例

5.3 效果展示 ​编辑

六、QSplitter

6.1 代码示例

6.2 效果展示

结语 


引言

在Qt框架中,布局管理是一个核心概念,它负责自动调整窗口部件(widgets)的大小和位置,以响应窗口大小的变化、不同平台的显示差异以及用户界面的动态变化。

Qt提供了多种布局管理器,包括QHBoxLayout、QVBoxLayout、QGridLayout、QFormLayout、QStackedLayout和QSplitter等。下面,我将详细解释这些布局管理器,并附带代码示例进行解析。 

一、QHBoxLayout(水平布局)

QHBoxLayout类用于在水平方向上排列窗口部件。它按照添加部件的顺序从左到右排列它们,如果空间不足,则可能使用滚动条(如果设置了的话)。

1.1 基础特性

  • 功能:将子控件水平排列。
  • 使用场景:适用于需要将多个控件在一行内水平排列的情况。
  • 特点:控件之间可以根据需要设置间距,整体宽度根据父控件宽度和子控件宽度自适应调整。

1.2 代码示例

#include <QApplication>  
#include <QWidget>  
#include <QHBoxLayout>  
#include <QPushButton>  
  
int main(int argc, char *argv[])  
{  
    QApplication app(argc, argv);  
  
    QWidget window;  
    window.setWindowTitle("QHBoxLayout 示例");  
  
    QHBoxLayout *layout = new QHBoxLayout(&window);  
  
    QPushButton *button1 = new QPushButton("按钮 1");  
    QPushButton *button2 = new QPushButton("按钮 2");  
    QPushButton *button3 = new QPushButton("按钮 3");  
  
    layout->addWidget(button1);  
    layout->addWidget(button2);  
    layout->addWidget(button3);  
  
    window.setLayout(layout);  
    window.show();  
  
    return app.exec();  
}

1.3 效果展示

 

二、QVBoxLayout(垂直布局)

与QHBoxLayout类似,QVBoxLayout类用于在垂直方向上排列窗口部件。部件按照添加的顺序从上到下排列。

2.1 基础特性

  • 功能:将子控件垂直排列。
  • 使用场景:适用于需要将多个控件在一列内垂直排列的情况。
  • 特点:控件之间可以根据需要设置间距,整体高度根据父控件高度和子控件高度自适应调整。

2.2 代码示例

与QHBoxLayout类似,只是将QHBoxLayout替换为QVBoxLayout(第14行代码)

#include <QApplication>  
#include <QWidget>  
#include <QHBoxLayout>  
#include <QPushButton>  
  
int main(int argc, char *argv[])  
{  
    QApplication app(argc, argv);  
  
    QWidget window;  
    window.setWindowTitle("QHBoxLayout 示例");  
  
    QVBoxLayout *layout = new QVBoxLayout(&window);
  
    QPushButton *button1 = new QPushButton("按钮 1");  
    QPushButton *button2 = new QPushButton("按钮 2");  
    QPushButton *button3 = new QPushButton("按钮 3");  
  
    layout->addWidget(button1);  
    layout->addWidget(button2);  
    layout->addWidget(button3);  
  
    window.setLayout(layout);  
    window.show();  
  
    return app.exec();  
}

2.3 效果展示

三、QGridLayout(网格布局) 

QGridLayout类提供了一个在二维网格中管理窗口部件的方法。你可以指定行数和列数,然后将部件放置在网格的特定位置。 

3.1 基础特性

  • 功能:将控件放置在一个二维网格中,可以精确控制每个控件的位置和大小。
  • 使用场景:适用于需要复杂布局,如表格或表单的情况。
  • 特点:可以灵活设置行数和列数,以及控件在每个格子中的对齐方式和间距。

3.2 代码示例

#include <QApplication>  
#include <QWidget>  
#include <QGridLayout>  
#include <QPushButton>  
  
int main(int argc, char *argv[])  
{  
    QApplication app(argc, argv);  
  
    QWidget window;  
    window.setWindowTitle("QGridLayout 示例");  
  
    QGridLayout *layout = new QGridLayout(&window);  
  
    QPushButton *button1 = new QPushButton("按钮 1");  
    QPushButton *button2 = new QPushButton("按钮 2");  
    QPushButton *button3 = new QPushButton("按钮 3");  
    QPushButton *button4 = new QPushButton("按钮 4");  
  
    layout->addWidget(button1, 0, 0); // 放置在第一行第一列  
    layout->addWidget(button2, 0, 1); // 放置在第一行第二列  
    layout->addWidget(button3, 1, 0); // 放置在第二行第一列  
    layout->addWidget(button4, 1, 1); // 放置在第二行第二列  
  
    window.setLayout(layout);  
    window.show();  
  
    return app.exec();  
}

3.3 效果展示

四、QFormLayout(表单布局) 

QFormLayout类用于管理表单中的字段和标签。它自动将标签放置在左侧(或顶部,取决于布局的方向),并将相应的字段放置在右侧(或底部)。

4.1 基础特性

  • 功能:用于创建表单,将标签(QLabel)和字段控件(如QLineEdit)成对排列。
  • 使用场景:适用于需要创建表单界面,如用户登录、注册等场景。
  • 特点:自动处理标签和字段控件的对齐和间距,使得表单界面更加整洁美观。

4.2 代码示例

#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 示例");  
  
    QFormLayout *formLayout = new QFormLayout(&window);  
  
    QLabel *nameLabel = new QLabel("姓名:");  
    QLineEdit *nameLineEdit = new QLineEdit();  
  
    QLabel *ageLabel = new QLabel("年龄:");  
    QLineEdit *ageLineEdit = new QLineEdit();  
  
    formLayout->addRow(nameLabel, nameLineEdit);  
    formLayout->addRow(ageLabel, ageLineEdit);  
  
    window.setLayout(formLayout);  
    window.show();  
  
    return app.exec();  
}

4.3 效果展示

五、QStackedLayout(堆叠布局) 

QStackedLayout类提供了一个堆叠窗口部件的容器,一次只能显示一个子部件。用户可以通过编程方式切换显示的子部件,或者在界面上提供控件(如标签页或按钮)来允许用户切换。 

5.1 基础特性

  • 功能:将多个控件堆叠在一起,但一次只显示一个控件。
  • 使用场景:适用于需要实现页面切换或向导式界面的情况。
  • 特点:通过索引或当前活动控件来控制显示哪个控件,隐藏其他控件。

5.2 代码示例

#include <QApplication>  
#include <QWidget>  
#include <QStackedLayout>  
#include <QPushButton>  
#include <QLabel>  
  
class StackedWidget : public QWidget {  
    Q_OBJECT  
public:  
    StackedWidget(QWidget *parent = nullptr) : QWidget(parent) {  
        QStackedLayout *stackedLayout = new QStackedLayout();  
  
        QLabel *page1 = new QLabel("这是第一页");  
        QLabel *page2 = new QLabel("这是第二页");  
        QLabel *page3 = new QLabel("这是第三页");  
  
        stackedLayout->addWidget(page1);  
        stackedLayout->addWidget(page2);  
        stackedLayout->addWidget(page3);  
  
        // 添加切换按钮  
        QHBoxLayout *buttonLayout = new QHBoxLayout();  
        QPushButton *button1 = new QPushButton("第一页");  
        QPushButton *button2 = new QPushButton("第二页");  
        QPushButton *button3 = new QPushButton("第三页");  
  
        connect(button1, &QPushButton::clicked, stackedLayout, [=]() { stackedLayout->setCurrentIndex(0); });  
        connect(button2, &QPushButton::clicked, stackedLayout, [=]() { stackedLayout->setCurrentIndex(1); });  
        connect(button3, &QPushButton::clicked, stackedLayout, [=]() { stackedLayout->setCurrentIndex(2); });  
  
        buttonLayout->addWidget(button1);  
        buttonLayout->addWidget(button2);  
        buttonLayout->addWidget(button3);  
  
        // 将按钮布局添加到主窗口的底部  
        QWidget *buttonWidget = new QWidget();  
        buttonWidget->setLayout(buttonLayout);  
  
        // 使用QVBoxLayout将stackedLayout和buttonWidget垂直排列  
        QVBoxLayout *mainLayout = new QVBoxLayout(this);  
        mainLayout->addLayout(stackedLayout);  
        mainLayout->addWidget(buttonWidget);  
    }  
};  
  
int main(int argc, char *argv[])  
{  
    QApplication app(argc, argv);  
  
    StackedWidget window;  
    window.setWindowTitle("QStackedLayout 示例");  
    window.show();  
  
    return app.exec();  
}

5.3 效果展示 

六、QSplitter

QSplitter类提供了一个可以让用户通过拖动分隔条来动态调整子部件大小的容器。它常用于需要用户能够自定义窗口分割比例的场景,如文件编辑器中的代码和预览窗口。 

6.1 代码示例

#include <QApplication>  
#include <QWidget>  
#include <QSplitter>  
#include <QTextEdit>  
#include <QListWidget>  
  
int main(int argc, char *argv[])  
{  
    QApplication app(argc, argv);  
  
    QSplitter *splitter = new QSplitter(Qt::Horizontal);  
  
    QTextEdit *textEdit = new QTextEdit();  
    QListWidget *listWidget = new QListWidget();  
  
    // 初始化列表小部件  
    QStringList items;  
    items << "项目 1" << "项目 2" << "项目 3";  
    listWidget->addItems(items);  
  
    // 将文本编辑器和列表小部件添加到分割器中  
    splitter->addWidget(textEdit);  
    splitter->addWidget(listWidget);  
  
    QWidget window;  
    window.setWindowTitle("QSplitter 示例");  
    QVBoxLayout *layout = new QVBoxLayout(&window);  
    layout->addWidget(splitter);  
  
    window.setLayout(layout);  
    window.show();  
  
    return app.exec();  
}

6.2 效果展示

结语 

Qt中提供了多种布局管理器,用于在界面设计中对控件进行排列和布局。这些布局管理器使得控件能够根据不同屏幕尺寸和分辨率自动调整大小和位置,提高了界面的可维护性和适应性。

以上就是关于Qt中布局管理的全部介绍,如有不足与缺陷之处,欢迎评论区留言!!! 

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

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

相关文章

NC 判断t1树中是否有与t2树完全相同的子树

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff0c;这篇文章男女通用&#xff0c;看懂了就去分享给你的码吧。 描述 给定彼此独立…

深度学习中的一些函数

目录 nn.Embeddingtriu 函数copy.deepcopy nn.Embedding #参数1&#xff1a;词表大小&#xff08;即词表单词个数&#xff09;即只要输入的值在0——n-1之间就可&#xff0c;对于序列长度无影响。 #参数2&#xff1a;词映射的维度n&#xff08;即将每个词映射成一个二维1*n&am…

文字短信怎么利用Python接口发送短信

在信息爆炸的今天&#xff0c;沟通成为了我们日常生活和工作中不可或缺的一部分。无论是企业运营、市场营销&#xff0c;还是个人交流、节日祝福&#xff0c;如何快速、准确地传递信息成为了许多人关注的焦点。群发短信&#xff0c;作为一种高效、经济的沟通方式&#xff0c;正…

一个prolog最简单推理示例

假设现在知道一些年轻人&#xff0c;谁喜欢谁&#xff0c;定义为love(x, y)&#xff1b; 定义了一些这样的关系&#xff1b; 如果x喜欢y&#xff0c;y也喜欢x&#xff0c;则定义他们是一对情侣&#xff1b; 规则表示为&#xff1a; lovers(X,Y) :- love(X,Y), love(Y,X). 输入…

Python | Leetcode Python题解之第376题摆动序列

题目&#xff1a; 题解&#xff1a; class Solution:def wiggleMaxLength(self, nums: List[int]) -> int:n len(nums)if n < 2:return nprevdiff nums[1] - nums[0]ret (2 if prevdiff ! 0 else 1)for i in range(2, n):diff nums[i] - nums[i - 1]if (diff > 0…

Java 5.1 - Spring

Spring 基础 什么是 Spring 框架&#xff1f; 开源的 轻量级的 Java 开发框架&#xff0c;旨在提高开发效率和系统可维护性。 一般我们说 Spring 都是指 Spring FrameWork&#xff0c;它是很多模块的集合&#xff0c;使用这些模块可以很方便地帮助我们进行 Java 开发。例如 …

监控电脑屏幕的软件叫什么?8款好用的监控电脑屏幕的软件推荐!

远程办公和数字化管理的风潮席卷而来&#xff0c;电脑屏幕监控软件已经悄然成为了企业和家庭不可或缺的得力助手。 这些神奇的小工具&#xff0c;不仅能让老板们远程监督员工的工作状态&#xff0c;确保团队高效运转&#xff0c;还能守护企业的信息安全。 接下来&#xff0c;…

JavaEE-传输层协议

目录 一、UDP协议 二、TCP协议 TCP报文结构 TCP十大核心机制 确认应答 超时重传 接收缓冲区 连接管理 建立连接 断开连接 一、UDP协议 学习一个网络协议首先要学习报文结构。 对于UDP协议来说&#xff0c;应用层数据到达UDP后就会给应用层数据加上UDP报头。 &#…

STM32G474的HAL_ADC_Start_DMA()传递指针问题

1、HAL_ADC_Start_DMA()传递指针问题 函数传递参数中若用到指针&#xff0c;则要注意指针的类型和源数据数据类型要保持一致&#xff0c;否则&#xff0c;会导致内存溢出。 STM32G474的ADC值是12位&#xff0c;HAL库用的是32位指针传输数据&#xff0c;因此&#xff0c;在定义保…

深度学习入门-09

基于小土堆学习 1、卷积层 卷积操作涉及到一个称为“卷积核”或“滤波器”的小窗口&#xff0c;在输入数据上滑动&#xff0c;并对每个位置上的数据进行加权求和&#xff0c;可能还会加上一个偏置项。这个加权求和的结果就构成了输出特征图&#xff08;feature map&#xff0…

SS-31;Elamipretide;伊拉米肽;线粒体靶向抗氧化剂SS-31肽;CAS:736992-21-5

【SS-31 简介】 SS-31肽是一种心磷脂过氧化物酶抑制剂和线粒体靶向肽。 它可以改善左心室和线粒体功能。SS-31肽可减轻 人小梁网状细胞中的线粒体功能障碍和氧化损伤。它可以防止iHTM和GTM(3)细胞受到H2O2诱导的持续氧化应激。慢性心力衰竭和线粒体肌病的I期临床试验正在进行中…

EPLAN中绘制多线原理图以及插入符号元件

EPLAN中绘制多线原理图以及插入符号元件 如下图所示&#xff0c;新建并打开多线原理图&#xff0c;点击菜单栏中的插入—电位连接点&#xff0c; 插入所需的电位连接点&#xff1b; 如下图所示&#xff0c;点击项目数据—符号&#xff0c;这样可以打开符号选择的导航器&#…

07 - procfs

---- 整理自 王利涛老师 课程 实验环境&#xff1a;宅学部落 www.zhaixue.cc 文章目录 1. procfs 快速入门2. procfs 文件创建的回调机制3. 在 proc 目录下创建子目录4. 通过 proc 接口修改内核变量5. 通过 proc 接口访问数组6. 序列文件&#xff1a;seq_file 编程接口7. seq_f…

Hbase离线迁移

假设是hbase集群&#xff0c;那么数据存储在hdfs上。 1.关闭2个hbase 2.使用distcp 将hdfs上的hbase数据迁移到另一个【相同路径】的hdfs上。 不知道目录的话&#xff0c;可以find / -name hbase-site.xml找一下。 hadoop distcp -Dmapreduce.job.hdfs-servers.token-renew…

XtQuant接口概述,想用miniQMT做量化哪家券商支持?

XtQuant.XtData 行情模块 xtdata是xtquant库中提供行情相关数据的模块&#xff0c;本模块旨在提供精简直接的数据满足量化交易者的数据需求&#xff0c;作为python库的形式可以被灵活添加到各种策略脚本中。 主要提供行情数据&#xff08;历史和实时的K线和分笔&#xff09;、…

无人机喊话器详解!!!

无人机喊话器&#xff0c;也被称为无人机扬声器&#xff0c;是一种安装在无人机上&#xff0c;用于通过空中向地面人员传递声音的设备。 一、功能特点 远程传递声音&#xff1a;无人机喊话器能够在较远的距离内清晰地传递声音&#xff0c;有效广播范围通常可达数百米甚至更远…

Linux下单网卡配置多个路由ip方法

Linux下配置网卡ip别名何谓ip别名 用windows的话说&#xff0c;就是为一个网卡配置多个ip。 什么场合增加ip别名能派上用场&#xff1f; 布网需要、多ip访问测试、特定软件对多ip的需要 下面通过几个例子简单介绍一下如何使用ifconfig命令给网卡配置ip别名。 一、首先为服务器…

会员通知短信怎么利用NodeJS发送短信

会员通知群发短信以其即时高效、高打开率、个性化定制、成本效益高、跨平台兼容以及法律合规等优势&#xff0c;在现代会员管理和营销策略中占据了重要地位。对于希望提升会员沟通效率、增强用户粘性和促进业务增长的企业而言&#xff0c;合理利用群发短信工具无疑是一个明智的…

left join 使用 sum()

一&#xff0c;表结构 表一&#xff0c;test_group 分组表 表二&#xff0c;test_user 用户表 test_group 和 test_user 是一对多的关系 二&#xff0c;sql 统计一班的总得分和所有用户的总年龄 SELECT SUM(a.score),SUM(b.age),a.groupname from test_group a LEFT JOIN…

Keepalived高可用配置服务器集群

前言 上章完成了通过nginx对服务器配置了负载均衡,保证了一个服务器宕机另一个服务器顶上,但是有一个问题出现了,如果nginx宕机了怎么办,这章会对这个问题进行讲解,配置集群来保证nginx宕机下一个顶上来,服务器一直能提供服务当一台服务器宕机的时候把从服务器切换为主,提供虚…