Qt布局管理器

news2024/11/18 0:27:20

一、布局管理器

1.1、布局管理器的作用

布局管理器是摆放控件的辅助工具,主要解决组件的位置和大小无法自适应父窗口变化的问题,主要功能如下:

  • 自动调整控件的位置,包括控件之间的间距、对齐等
  • 当用户调整窗口大小时,位于布局管理器内的控件也会随之调整大小,从而保持整个界面的美观

借助布局管理器,无需再逐个调整控件的位置和大小,可以将更多的精力放在软件功能的实现上。

1.2、布局管理器类继承结构图

Qt 共提供了 5 种布局管理器,每种布局管理器对应一个类,分别是 QVBoxLayout(垂直布局)、QHBoxLayout(水平布局)、QGridLayout(网格布局)、QFormLayout(表单布局)和 QStackedLayout(分组布局),继承关系如下图:

在这里插入图片描述

二、使用布局管理器

2.1、QVBoxLayout(垂直布局)

将所有控件从上到下(或者从下到上)依次摆放,例如:

在这里插入图片描述

int main(int argc, char *argv[])
{
	QApplication a(argc, argv);
	//创建主窗口
	QWidget widget;
	//设置窗口标题
	widget.setWindowTitle("QVBoxLayout");
	//设置窗口大小
	widget.resize(500, 250);

	//创建垂直布局管理器
	QVBoxLayout *layout = new QVBoxLayout;
	//设置布局管理器中所有控件从下往上依次排列
	layout->setDirection(QBoxLayout::BottomToTop);

	//连续创建 3 个文本框,并设置它们的背景和字体大小
	QLabel lab1("Label1");
	lab1.setStyleSheet("QLabel{background:#dddddd;font:20px;}");
	lab1.setAlignment(Qt::AlignCenter);
	QLabel lab2("Label2");
	lab2.setStyleSheet("QLabel{background:#cccccc;font:20px;}");
	lab2.setAlignment(Qt::AlignCenter);
	QLabel lab3("Label3");
	lab3.setStyleSheet("QLabel{background:#ffffff;font:20px;}");
	lab3.setAlignment(Qt::AlignCenter);

	//组件的伸缩系数比是 1:1:1
	layout->addWidget(&lab3, 1);
	layout->addWidget(&lab2, 1);
	layout->addWidget(&lab1, 1);

	//将布局管理器添加到widget窗口中
	widget.setLayout(layout);
	widget.show();
	return a.exec();
}

2.2、QHBoxLayout(水平布局)

水平布局指的是将所有控件从左到右(或者从右到左)依次摆放,例如:

在这里插入图片描述

int main(int argc, char *argv[])
{
	QApplication a(argc, argv);
	//创建主窗口
	QWidget widget;
	//设置窗口标题
	widget.setWindowTitle("QHBoxLayout");
	//设置窗口大小
	widget.resize(500, 250);

	//创建水平布局管理器
	QHBoxLayout *layout = new QHBoxLayout;
	//设置布局管理器中所有控件的布局方向为从右往左依次排列
	layout->setDirection(QBoxLayout::RightToLeft);

	//连续创建 3 个文本框,并设置它们的背景和字体大小
	QLabel lab1("Label1");
	lab1.setStyleSheet("QLabel{background:#dddddd;font:20px;}");
	lab1.setAlignment(Qt::AlignCenter);
	QLabel lab2("Label2");
	lab2.setStyleSheet("QLabel{background:#cccccc;font:20px;}");
	lab2.setAlignment(Qt::AlignCenter);
	QLabel lab3("Label3");
	lab3.setStyleSheet("QLabel{background:#ffffff;font:20px;}");
	lab3.setAlignment(Qt::AlignCenter);

	//组件的伸缩系数比是 1:1:1
	layout->addWidget(&lab3, 1);
	layout->addWidget(&lab2, 1);
	layout->addWidget(&lab1, 1);

	//将布局管理器添加到 widget 窗口中
	widget.setLayout(layout);
	widget.show();
	return a.exec();
}

2.3、QGridLayout(网格布局)

网格布局又称格栅布局或者表格布局,指的是将一些控件按照行和列排列在窗口上,例如:

在这里插入图片描述

int main(int argc, char *argv[])
{
	QApplication a(argc, argv);
	//创建主窗口
	QWidget widget;
	//设置窗口标题
	widget.setWindowTitle("QGridLayout");
	//设置窗口大小
	widget.resize(500, 250);

	//创建网格布局管理器
	QGridLayout *layout = new QGridLayout;

	//连续创建 3 个文本框,并设置它们的背景和字体大小
	QLabel lab1("Label1");
	lab1.setStyleSheet("QLabel{background:#dddddd;font:20px;}");
	lab1.setAlignment(Qt::AlignCenter);
	QLabel lab2("Label2");
	lab2.setStyleSheet("QLabel{background:#cccccc;font:20px;}");
	lab2.setAlignment(Qt::AlignCenter);
	QLabel lab3("Label3");
	lab3.setStyleSheet("QLabel{background:#ffffff;font:20px;}");
	lab3.setAlignment(Qt::AlignCenter);
	QLabel lab4("Label4");
	lab4.setStyleSheet("QLabel{background:#aaaaaa;font:20px;}");
	lab4.setAlignment(Qt::AlignCenter);
	QLabel lab5("Label5");
	lab5.setStyleSheet("QLabel{background:#bbbbbb;font:20px;}");
	lab5.setAlignment(Qt::AlignCenter);

	//组件添加到网格布局管理器
	layout->addWidget(&lab1, 0, 0);
	layout->addWidget(&lab2, 0, 1);
	layout->addWidget(&lab3, 1, 0, 1, 2);
	layout->addWidget(&lab4, 2, 0);
	layout->addWidget(&lab5, 2, 1);

	//将布局管理器添加到 widget 窗口中
	widget.setLayout(layout);
	widget.show();
	return a.exec();
}

2.4、QFormLayout(表单布局)

Qt 提供了很多种输入框控件,包括 QLineEdit 单行输入框、QTextEdit 多行输入框等。通常情况下,每个输入框的旁边都会附带一些文字(又称标签),用来提示用户需要输入的信息。QFormLayout 可以容纳很多个输入框以及对应的标签,并将它们从上到下依次排列在界面上,如下:

在这里插入图片描述

int main(int argc, char *argv[])
{
	QApplication a(argc, argv);
	//创建主窗口
	QWidget widget;
	//设置窗口大小
	widget.resize(500, 250);
	//设置窗口标题
	widget.setWindowTitle("QFormLayout");

	//创建表单布局管理器
	QFormLayout* layout = new QFormLayout();
	//设置表单中的标签都位于控件的上方
	layout->setRowWrapPolicy(QFormLayout::WrapAllRows);
	//添加 3 行输入框和标签
	layout->addRow("Name:", new QLineEdit());
	layout->addRow("Email:", new QLineEdit());
	layout->addRow("Adress:", new QLineEdit());
	//设置行间距和列间距为 10
	layout->setSpacing(10);
	//将 layout 表单添加到 widget 窗口中
	widget.setLayout(layout);
	widget.show();
	return a.exec();
}

2.5、QStackedLayout(分组局管理器)

QStackedLayout布局管理器可以容纳多个控件或者窗口,但每次只显示其中的一个,如下:

在这里插入图片描述

int main(int argc, char *argv[])
{
	QApplication a(argc, argv);
	//创建主窗口
	QWidget widget;
	//设置窗口标题
	widget.setWindowTitle("QStackedLayout");
	//设置窗口大小
	widget.resize(500, 250);

	//创建一个列表
	QListWidget *listWidget = new QListWidget(&widget);
	listWidget->setMinimumWidth(150);
	listWidget->setFont(QFont("宋体", 14));
	listWidget->addItem("QPushButton");
	listWidget->addItem("QLabel");
	listWidget->addItem("QLineEdit");

	//新建 3 个窗口,分别放置文本框、按钮和单行输入框
	QWidget widget1;
	widget1.setMinimumSize(200, 200);
	QPushButton but1("PushButton", &widget1);

	QWidget widget2;
	widget2.setMinimumSize(200, 200);
	QLabel lab1("This is a Label", &widget2);

	QWidget widget3;
	widget3.setMinimumSize(200, 200);
	QLineEdit edit("This is a QLineEdit", &widget3);

	//创建一个分组布局,将 3 个窗口添加到分组控件中
	QStackedLayout *stackedLayout = new QStackedLayout;
	stackedLayout->addWidget(&widget1);
	stackedLayout->addWidget(&widget2);
	stackedLayout->addWidget(&widget3);

	//向主窗口中添加一个水平布局控件
	QHBoxLayout *layout = new QHBoxLayout;
	layout->addWidget(listWidget, 1);
	layout->addLayout(stackedLayout, 4);

	//将 layout 水平布局控件添加到 widget 窗口中
	widget.setLayout(layout);
	widget.show();

	//连接信号和槽,实现当点击列表中的某一项,切换分组布局管理器显示的控件
	QObject::connect(listWidget, &QListWidget::currentRowChanged, stackedLayout, &QStackedLayout::setCurrentIndex);
	return a.exec();
}

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

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

相关文章

【洛谷】P1404 平均数

【洛谷】P1404 平均数 题目描述 给一个长度为 n n n 的数列,我们需要找出该数列的一个子串,使得子串平均数最大化,并且子串长度 ≥ m \ge m ≥m。 输入格式 第一行两个整数 n n n 和 m m m。 接下来 n n n 行,每行一个整数 …

激光点云3D目标检测算法之CenterPoint

激光点云3D目标检测算法之CenterPoint 本文首发于公众号【DeepDriving】,欢迎关注。 前言 CenterPoint是CVPR 2021的论文《Center-based 3D Object Detection and Tracking》中提出的一个激光点云3D目标检测与跟踪算法框架,与以往算法不同的是&#xff…

一大波特斯拉人形机器人上线,马斯克震撼官宣2款新车!

来源 | 新智源 ID | AI-era 【导读】这次特斯拉股东日,虽没有新车,但马斯克确定Cybertruck今年一定会来。 特斯拉股东日,依旧没有新车。 万众瞩目的马斯克登台继续画饼,「我不官宣新车,不过新车年销量会超过500万」…

【云原生】k8sPod基础概念

k8sPod基础概念 一、Pod概述1、pod概念2、Pod资源限制 二、Pod的两种使用方式三、资源共享1、创建Pod的方式2、Pod功能 四、底层容器Pause1、Pause共享资源2、Pause主要功能3、Pod与Pause结构设计用意 五、镜像的拉取策略1、Pod容器镜像拉取策略2、Pod重启策略 六、容器的分类1…

信息收集-ip地址

1、cdn网络 CDN(Content Delivery Network)网络是一种分布式网络架构。它通过将内容(如网页、图片、视频等)缓存到公共的服务器上,以便更快速、更可靠地交付给用户所在的位置。CDN解决了Internet中的一些固有瓶颈和性…

【ROS】Ubuntu22.04安装ROS2(Humble Hawksbill)

0、版本说明 Ubuntu22.04对应的ROS2的版本为Humble Hawksbill(ros-humble) 如果不是在Ubuntu22.04中安装ROS,请参考下面Ubuntu和ROS的版本对应关系 1、更新apt包列表 $ sudo apt update2、设置编码 将ubuntu环境语言编码设置为en_US en_…

appium自动化测试实战详解及框架搭建

目录 一、Appium的介绍 二、Appium实战(以真机为例) 一、Appium的介绍 Appium是一款开源的自动化测试工具,其支持iOS和安卓平台上的原生的,基于移动浏览器的,混合的应用。 1、 使用appium进行自动化测试的好…

【C++】容器篇(一)—— vector 的基本概述以及模拟实现

前言: 在之前,我们已经对 string类进行了基本的概述,并且手动的实现了string类中常用的接口函数。本期,我将带领大家学习的是STL库中的一个容器 -- vector 的学习。相比于之前的string类,本期的 vector 相对来说实现起…

CSAPP复习(三)

CH1: 但是如果问什么时候 得到二进制文件 那就是汇编的时候 CH2 sizeof 的返回值是一个无符号数 然后i-D自动默认是一个无符号数 无符号数不能出现负数 所以出现了一个循环 所以永远不可能循环完成。 CH7链接 什么是静态库?使用静态库的优点是什么? …

在windows内使用virtualbox搭建安卓x86--以及所遇到的问题解决--3

一.ARM兼容包的植入 1.下载arm包: 2.安装arm兼容包 3.验证arm兼容包是否移植成功 二.触屏无效 三.玩游戏卡顿严重 一.ARM兼容包的植入 在AndroidX86系统内大部分应用(国内)并没有适配X86架构,安装基于arm架构的应用会出现报错的情况,如遇到此问题可…

【Linux网络】Linux防火墙

Linux防火墙 一 、Linux包过滤防火墙概述1.1iptables概述1.2netfitel与iptables的关系1.3四表五链1.3.1 四表1.3.2五链1.3.3数据包到达防火墙时,规则表之间的优先顺序**1.3.4规则链之间的匹配顺序** 二、iptables的安装与配置方法2.1iptables的安装2.2iptables的配置…

MySQL数据库基础3-基础查询

文章目录 基础查询(单表)替换查询结果排序筛选分页结果更新表删除数据截断(清空)表聚合函数分组查询 基础查询(单表) 创建表、单行插入、多行插入就不重复介绍了。 替换 当我们的程序每天都会产生大量的数据,而这些数据都是前一天或者再之前的数据更新产生&#…

0基础学习VR全景 平台篇第26章:热点功能-3D物体/空间模型

大家好,欢迎观看蛙色VR官方系列——后台使用课程! 本期为大家带来蛙色VR平台,热点功能—3D物体/空间模型操作。 热点,指在全景作品中添加各种类型图标的按钮,引导用户通过按钮产生更多的交互,增加用户的多…

opencv_c++学习(十四)

一、图像直方图的统计与绘制 如果直方图各个数字之间分布比较均衡,则其对比度就相对较低,反之亦然。同时也可以通过直方图可以大致了解图像的亮暗等。 calcHist(const Mat * images, int nimages, const int * channels, lnputArray mask, OutputArray…

【Python Xpath】零基础也能轻松掌握的学习路线与参考资料

Python是一种面向对象的编程语言。Xpath是一种在XML文档中定位信息的方法。XPath是一种语言,可以用于xml和html文档中选择和查找节点。在Python中,我们可以使用xpath来解析html页面,从而提取所需的数据。 Python xpath学习路线: …

C++中的继承、以及赋值兼容转换。

一、继承的概念及定义 继承可以使代码复用,允许在保持原有类特性的基础上进行扩展。 举个例子:就好比我现在要封装老师、学生等这些人的属性和方法,但是这些人都有重复的属性和方法,比如name、age、sex等等,那么我可…

let、const、var的区别,解构赋值,箭头函数

let、const、var的区别 使用var声明的变量,其作用域为该语句所在的函数内,且存在变量提升现象。使用let声明的变量,其作用域为该语句所在的代码块内,不存在变量提升。使用const声明的是常量,在后面出现的代码块中,不能在修改改常量的值。 var let const 函数级作用域 块级…

Go语言核心编程-运算符和进制转换

第 4 章 运算符 4.1 运算符的基本介绍 运算符是一种特殊的符号,用以表示数据的运算、赋值和比较等 运算符是一种特殊的符号,用以表示数据的运算、赋值和比较等 算术运算符赋值运算符比较运算符/关系运算符逻辑运算符位运算符其它运算符 4.2 算术运算符…

体验联网版 ChatGPT:优点和缺点同样明显,还藏着无限可能

ChatGPT 有点像古希腊的阿喀琉斯:它很强大,却有个致命的弱点——无法联网,这注定了它只能是一个停留在 2021 年的超人。 但很快,我们将等到一个「鱼和熊掌兼得」的时刻。 通过插件集的 Web browsing 功能,ChatGPT 就…

C++每日一练:贝博士的机械零件(补全题目)奇偶排序(巧妙快排)寻因找祖

文章目录 前言一、贝博士的机械零件1、题目2、解法 二、奇偶排序(巧用快排)三、寻因找祖 前言 今天的题目中寻因找祖最难了,明显的数学题,笔者这数学文盲水平肯定不会,用暴力搞了一波,只有50%。就去考察学…