布局管理(Layouts)-Qt-思维导图-学习笔记
布局管理(Layouts)

Qt 提供了非常丰富的布局类,主要包括以下基本布局管理类
QBoxLayout
- 提供了水平和垂直的布局管理,可以将子部件按行或列排列。根据排列方向的不同,QBoxLayout 分为 QHBoxLayout(水平布局)和 QVBoxLayout(垂直布局)
QGridLayout
- 提供了网格形式的布局管理,可以将子部件按行和列排列,类似于表格的布局方式,适合需要严格对齐的布局场景
QFormLayout
- 提供了将输入部件和标签成组排列的布局管理,常用于表单界面,标签和输入控件成对出现并对齐
QStackedLayout
- 提供了一组布局后的部件,可以对它们进行分布显示。它允许在不同的页面或视图之间切换,每次只显示一个部件
继承关系及嵌套使用
-
继承关系
- 这些布局类都继承自 QLayout,而 QLayout 继承自 QObject,而不是 QWidget。这意味着布局类管理子部件的位置和大小,而不是直接显示内容
-
嵌套使用
- 可以将这些布局类彼此嵌套,以创建更加复杂的用户界面布局。例如,可以在一个 QVBoxLayout 中嵌入一个 QHBoxLayout,以实现混合排列效果
Layouts 组里面的 4 种布局
(1)Vertiacl Layout:垂直布局
(2)Horizontal Layout:水平布局
QBoxLayout
-
控件简介
-
继承关系:QBoxLayout 继承自 QLayout
-
排列方式:提供水平或垂直排列子部件的能力
-
空间管理:获取从其父布局或 parentWidget() 中获得的可用空间,并将其分成一列框
-
子部件填充:每个托管小部件填充一个框,从而实现均匀分布
-
-
用法示例
-
使用几个按钮,将他们设置为垂直排布和水平排布,以及设置它们的一些属性
-
新建例程中不要勾选“Generate form”,默认继承 QMainWindow 类即可
-
mainwindow.h
- 1 #ifndef MAINWINDOW_H
2 #define MAINWINDOW_H
3
4 #include
5 #include
6 #include
7 #include
8
9 class MainWindow : public QMainWindow
10 {
11 Q_OBJECT
12
13 public:
14 MainWindow(QWidget parent = nullptr);
15 ~MainWindow();
16
17 private:
18 / 声明按钮对象数组 */
19 QPushButton pushButton[6];
20
21 / 定义两个 widget,用于容纳排布按钮 */
22 QWidget *hWidget;
23 QWidget vWidget;
24
25 / QHBoxLayout 与 QVBoxLayout 对象 */
26 QHBoxLayout *hLayout;
27 QVBoxLayout *vLayout;
28
29 };
30 #endif // MAINWINDOW_H
- 1 #ifndef MAINWINDOW_H
-
mainwindow.cpp
- 1 #include “mainwindow.h”
2 #include
3
4 MainWindow::MainWindow(QWidget parent)
5 : QMainWindow(parent)
6{
7 / 设置主窗口的位置与大小 /
8 this->setGeometry(0, 0, 800, 480);
9
10 / 实例化与设置位置大小 /
11 hWidget = new QWidget(this);
12 hWidget->setGeometry(0, 0, 800, 240);
13
14 vWidget = new QWidget(this);
15 vWidget->setGeometry(0, 240, 800, 240);
16
17 hLayout = new QHBoxLayout();
18 vLayout = new QVBoxLayout();
19
20 / QList是 Qt 的一种泛型容器类。
21 * 它以链表方式存储一组值,
22 * 并能对这组数据进行快速索引
23 /
24 QList list;
25 / 将字符串值插入 list /
26 list<<“one”<<“two”<<“three”<<“four”<<“five”<<“six”;
27
28 / 用一个循环实例化 6 个按钮 /
29 for(int i = 0; i < 6; i++){
30 pushButton[i] = new QPushButton();
31 pushButton[i]->setText(list[i]);
32 if(i < 3) {
33 / 将按钮添加至 hLayout 中 /
34 hLayout->addWidget(pushButton[i]);
35 } else {
36 / 将按钮添加至 vLayout 中 /
37 vLayout->addWidget(pushButton[i]);
38 }
39 }
40 / 设置间隔为 50 /
41 hLayout->setSpacing(50);
42
43 / hWidget 与 vWidget 的布局设置为 hLayout/vLayout */
44 hWidget->setLayout(hLayout);
45 vWidget->setLayout(vLayout);
46 }
47
48 MainWindow::~MainWindow()
49 {
50 }
- 1 #include “mainwindow.h”
-
main.cpp
- 由新建项目时生成,无改动
-
-
运行效果
- 在 hWidget 中添加了 3 个水平排布的按钮,在 vWidget
中添加了 3 个垂直排布的按钮
- 在 hWidget 中添加了 3 个水平排布的按钮,在 vWidget
(3) Grid Layout:网格布局
-
QGridLayout
-
控件简介
-
继承关系:QGridLayout 继承自 QLayout
-
空间管理:获取可用的空间(通过父布局或 parentWidget()),并将该空间划分为行和列
-
子部件定位:将管理的每个小部件放入正确的单元格中
-
动态调整:由于网格布局会随着窗口拉伸而变化,需设置组件之间的比例系数
-
行列比例:与 QBoxLayout 不同,网格布局还需要分别设置行和列的比例系数,以实现更灵活的布局
-
-
用法示例
-
使用几个按钮,将他们设置为网格布局,同时设置它们的行、列比例系数(拉伸因子),以及设置它们的一些属性
-
不要勾选“Generate form”,默认继承 QMainWindow 类即可
-
mainwindow.h
- 1 #ifndef MAINWINDOW_H
2 #define MAINWINDOW_H
3
4 #include
5 #include
6 #include
7
8 class MainWindow : public QMainWindow
9{
10 Q_OBJECT
11
12 public:
13 MainWindow(QWidget parent = nullptr);
14 ~MainWindow();
15 private:
16
17 / 声明 widget 窗口部件,用于容纳下面 4 个 pushButton 按钮 */
18 QWidget gWidget;
19
20 / 声明 QGridLayout 对象 */
21 QGridLayout gridLayout;
22
23 / 声明 pushButton 按钮数组 */
24 QPushButton *pushButton[4];
25
26 };
27 #endif // MAINWINDOW_H
- 1 #ifndef MAINWINDOW_H
-
mainwindow.cpp
- 1 #include “mainwindow.h”
2
3 MainWindow::MainWindow(QWidget parent)
4 : QMainWindow(parent)
5{
6 / 设置位置与大小 /
7 this->setGeometry(0, 0, 800, 480);
8
9 / 实例化 /
10 gWidget = new QWidget(this);
11 / 设置 gWidget 居中央 /
12 this->setCentralWidget(gWidget);
13
14 gridLayout = new QGridLayout();
15 / QList 链表,字符串类型 /
16 QList list;
17 list<<“按钮 1”<<“按钮 2”<<“按钮 3”<<“按钮 4”;
18 for (int i = 0; i < 4; i++){
19 pushButton[i] = new QPushButton();
20 pushButton[i]->setText(list[i]);
21 / 设置最小宽度与高度 /
22 pushButton[i]->setMinimumSize(100, 30);
23 / 自动调整按钮的大小 /
24 pushButton[i]->setSizePolicy(
25 QSizePolicy::Expanding,
26 QSizePolicy::Expanding
27 );
28 switch (i) {
29 case 0:
30 / 将 pushButton[0]添加至网格的坐标(0,0),下同 /
31 gridLayout->addWidget(pushButton[i], 0, 0);
32 break;
33 case 1:
34 gridLayout->addWidget(pushButton[i], 0, 1);
35 break;
36 case 2:
37 gridLayout->addWidget(pushButton[i], 1, 0);
38 break;
39 case 3:
40 gridLayout->addWidget(pushButton[i], 1, 1);
41 break;
42 default:
43 break;
44 }
45 }
46 / 设置第 0 行与第 1 行的行比例系数 /
47 gridLayout->setRowStretch(0, 2);
48 gridLayout->setRowStretch(1, 3);
49
50 / 设置第 0 列与第 1 列的列比例系数 /
51 gridLayout->setColumnStretch(0, 1);
52 gridLayout->setColumnStretch(1, 3);
53
54 / 将 gridLayout 设置到 gWidget */
55 gWidget->setLayout(gridLayout);
56 }
57
58 MainWindow::~MainWindow()
59 {
60 }
- 1 #include “mainwindow.h”
-
main.cpp
- 由新建项目时生成,无改动
-
-
运行效果
- 在 gWidget 中添加了 4 个按钮,因为设置了行、列的系数比(拉伸因子),所以看到的按钮是按系数比的比例显示
-
(4)Form Layout:表单布局
-
QFormLayout
-
控件简介
-
继承关系:QFormLayout 继承自 QLayout
-
功能:管理输入小部件及其关联标签的表单
-
布局形式:以两列的形式布局子部件,左列由标签组成,右列由输入小部件(如 QLineEdit(行编辑器)、QSpinBox(旋转框等))组成
-
换行策略:通常使用 setRowWrapPolicy(RowWrapPolicy policy) 接口函数设置布局的换行策略,以控制布局效果
-
-
用法示例
-
使用 addRow(const QString &labelText,
QWidget *field)来创建一个带有给定文本的 QLabel 及 QWidget 小部件,并且它们是伙伴关系 -
不要勾选“Generate form”,默认继承 QMainWindow 类即可
-
mainwindow.h
- 1 #ifndef MAINWINDOW_H
2 #define MAINWINDOW_H
3
4 #include
5 #include
6 #include
7
8 class MainWindow : public QMainWindow
9{
10 Q_OBJECT
11
12 public:
13 MainWindow(QWidget parent = nullptr);
14 ~MainWindow();
15 private:
16 / widget 对象 */
17 QWidget fWidget;
18
19 / 用于输入用户名 */
20 QLineEdit userLineEdit;
21
22 / 用于输入密码 */
23 QLineEdit passwordLineEdit;
24
25 / 声明 QFormLayout 对象 */
26 QFormLayout *formLayout;
27 };
28 #endif // MAINWINDOW_H
- 1 #ifndef MAINWINDOW_H
-
mainwindow.cpp
- 1 #include “mainwindow.h”
2
3 MainWindow::MainWindow(QWidget parent)
4 : QMainWindow(parent)
5{
6 / 设置位置与大小 /
7 this->setGeometry(0, 0, 800, 480);
8
9 / 实例化及设置位置与大小,下同 /
10 fWidget = new QWidget(this);
11 fWidget->setGeometry(250, 100, 300, 200);
12
13 userLineEdit = new QLineEdit();
14 passwordLineEdit = new QLineEdit();
15
16 formLayout = new QFormLayout();
17
18 / 添加行 /
19 formLayout->addRow(“用户名:”, userLineEdit);
20 formLayout->addRow(“密码 :”, passwordLineEdit);
21
22 / 设置水平垂直间距 /
23 formLayout->setSpacing(10);
24
25 / 设置布局外框的宽度 /
26 formLayout->setMargin(20);
27
28 / 将 formLayout 布局到 fWidget */
29 fWidget->setLayout(formLayout);
30 }
31
32 MainWindow::~MainWindow()
33 {
34 }
- 1 #include “mainwindow.h”
-
main.cpp
- 由新建项目时生成,无改动
-
-
运行效果
- 在 fWidget 中添加了两行,同时设置了它们的间隔,与距边框的宽度。与 QGirdLayout 布局比较,QFomLayout 布局比较适用于行与列比较少的布局格局。如果是多行多列的布局,应该使用 QGirdLayout 布局
-
相关文章:
布局管理(Layouts)-Qt-思维导图-学习笔记
布局管理(Layouts) Qt 提供了非常丰富的布局类,主要包括以下基本布局管理类 QBoxLayout 提供了水平和垂直的布局管理,可以将子部件按行或列排列。根据排列方向的不同,QBoxLayout 分为 QHBoxLayout(水平布局)和 QVBox…...
《区块链赋能游戏业:破解虚拟资产交易与确权难题》
在当今数字化的时代,游戏行业正以前所未有的速度发展,虚拟资产在游戏中的重要性日益凸显。然而,虚拟资产的交易和确权问题一直困扰着游戏开发者和玩家。随着区块链技术的引入,为解决这些问题带来了新的曙光。 首先,我…...
机器学习第十一章-特征选择与稀疏学习
11.1子集收集与评价 属性称为"特征" ,对当前学习任务有用的属性称为"相关特征" 、没什么用的属性称为"无关特 征" . 从给定的特征集合中选择出相关特征于集的过程,称为"特征选择"。 特征选择是一个重要的"…...
C#中客户端直接引用服务端Proto文件
gRPC 客户端是从 .proto 文件生成的具体客户端类型。 具体 gRPC 客户端具有转换为 .proto 文件中 gRPC 服务的方法。 下一步打开【服务引用】 控制面板 选择grpc选项,然后继续 到此配置完成,然后就和服务共用一份protocol文件...
SiLM5932SHO系列SiLM5932SHOCG-DG 12A/12A强劲驱动电流能力 支持主动短路保护功能(ASC)单通道隔离门极驱动器
SiLM5932SHO系列是一款单通道隔离驱动器,提供12A源电流和12A灌电流。主动保护功能包括退饱和过流检测、UVLO、隔离故障报警和 4A 米勒钳位。输入侧电源的工作电压为3V至5.5V,输出侧电源的工作电压范围为13V至30V。所有电源电压引脚都有欠压锁定 (UVLO) 保…...
本地项目上传github
一、先在github(GitHub: Let’s build from here GitHub)上创建仓库 1,登录github后,点击右上角头像,点击 Your repositories 2,点击new 3,填写仓库名,假设命名 testhub࿰…...
使用zip包来安装mysql
下载 下载地址mysql,使用5.7.23 配置环境变量 添加到系统变量中 C:\Users\Admin\Downloads\mysql-5.7.23-win32\bin 添加my.ini配置文件 在C:\Users\Admin\Downloads\mysql-5.7.23-win32目录下添加my.ini [mysqld] # 设置3306端口 port3306# 自定义设置mysql的安装目录 b…...
嵌入式面经篇十——驱动开发
文章目录 前言一、驱动开发1、Linux 驱动程序的功能是什么?2、内核程序中申请内存使用什么函数?3、内核程序中申请内存和应用程序时申请内存有什么区别?4、自旋锁和信号量在互斥使用时需要注意什么?在中断服务程序里面的互斥是使用…...
MySQL(四)——常用函数
文章目录 函数字符串函数数值函数日期函数流程函数 函数 函数,是指一段可以直接被另一段程序调用的程序或代码。 MySQL中内置了许多函数,我们只需在合适的场景下调用它们即可,调用函数查询结果直接使用SELECT即可,并且可以嵌套使…...
C++ //练习 17.38 扩展上一题中你的程序,将读入的每个单词打印到它所在的行。
C Primer(第5版) 练习 17.38 练习 17.38 扩展上一题中你的程序,将读入的每个单词打印到它所在的行。 环境:Linux Ubuntu(云服务器) 工具:vim 代码块 #include<iostream> #include<…...
NC 丑数
系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 描述 把只包含质因…...
Spring Boot 整合 Spring AI 实现项目接入ChatGPT(OpenAl的调用)
当前各种AI项目层出不穷,但绝大多数都是用python写的,现在Spring开源了Spring AI项目,让Java开发者也可以轻松给自己的springboot项目集成AI能力。目前spring AI正式版本为0.8.1,支持接入openAI、Ollama、Azure openAI、Huggingfa…...
react中 useContext 和useReducer的使用
在React中,useContext 和 useReducer 是两个非常有用的Hooks,它们分别用于管理跨组件的状态和复杂的状态逻辑。下面将分别介绍这两个Hooks的使用方式及其结合使用的场景。 1. useContext useContext 允许你订阅React的Context变化。Context提供了一种在…...
Android:动态更新app启动图标和应用名
一、需求背景 每逢重要佳节,很多应用启动图标会自动更新为对应佳节的图标,应用无需更新。 二、效果图 更新后的启动图标和应用名称 三、实现流程 Android app只能替换内置的icon,因此需要提前将logo图标放入App资源文件件里 实际项目App更新…...
深入探讨 ElementUI 动态渲染 el-table
在前端开发中,表格是不可或缺的一部分。无论是数据展示、数据录入,还是数据分析,表格都扮演着重要的角色。而在 Vue.js 生态系统中,ElementUI 提供了一个强大且灵活的表格组件——el-table。本文将带你深入了解如何使用 ElementUI…...
数据炼金术:用Python爬虫精炼信息
标题:数据炼金术:用Python爬虫精炼信息 在数据泛滥的互联网时代,Python爬虫不仅是搜集信息的利器,更是清洗和格式化数据的炼金术。本文将带你走进数据清洗和格式化的世界,展示如何使用Python爬虫从海量网络信息中提取…...
C++第三十八弹---一万六千字使用红黑树封装set和map
✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】【C详解】 目录 1、set/map基本结构 2、红黑树基本结构改造 3、红黑树的迭代器 4、set的模拟实现 5、map的模拟实现 6、完整代码 1、set/map基本结构 在封装…...
★ C++基础篇 ★ vector 类
Ciallo~(∠・ω< )⌒☆ ~ 今天,我将继续和大家一起学习C基础篇第六章----vector类 ~ 目录 一 vector的介绍及使用 1.1 vector的介绍 1.2 vector的使用 1.2.1 vector的定义 1.2.2 vector iterator 的使用 1.2.3 vector 空间增长问题 1.2.4 vecto…...
原生js用Export2Excel导出excel单级表头和多级表头数据方式实现
原生js用Export2Excel导出excel单级表头和多级表头数据方式实现 原生js用Export2Excel导出excel单级表头和多级表头数据方式实现HTML文件导入需要的文件HTML文件中实现导出函数HTML总代码实现汇总(直接复制代码,注意js引入路径) 原生js用Expo…...
急需翻译PDF文件怎么办?pdf翻译在线快速帮你解决
面对满屏幕密密麻麻的pdf文件,我常常感到头疼! 语言障碍让我在获取信息的道路上踌躇不前,但自从我发现了pdf在线翻译成中文的神奇工具,一切问题似乎都迎刃而解。 这些软件不仅让我能够快速跨过语言壁垒,还让我在学术…...
【kafka】Golang实现分布式Masscan任务调度系统
要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...
MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例
一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...
NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...
CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云
目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...
Element Plus 表单(el-form)中关于正整数输入的校验规则
目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入(联动)2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...
腾讯云V3签名
想要接入腾讯云的Api,必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口,但总是卡在签名这一步,最后放弃选择SDK,这次终于自己代码实现。 可能腾讯云翻新了接口文档,现在阅读起来,清晰了很多&…...
群晖NAS如何在虚拟机创建飞牛NAS
套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...
