QT布局详解 QT5大布局详解

QT布局详解 QT5大布局详解

1. Qt 布局基础

在 Qt 中,布局管理器用于自动调整窗口中控件的位置和大小。它们根据控件的尺寸策略、父窗口的大小以及控件的彼此关系,动态地调整控件。

常用的布局类包括:

  • QHBoxLayout:水平布局管理器。
  • QVBoxLayout:垂直布局管理器。
  • QGridLayout:网格布局管理器。
  • QFormLayout:表单布局管理器。
  • QSplitter: 分裂器布局管理器
    布局管理器通常与 QWidget 结合使用,以确保应用程序在不同大小的窗口中自适应调整。

2. 常用布局类

2.1. QHBoxLayout(水平布局)

QHBoxLayout 将控件从左到右水平排列。它会根据窗口大小和控件的大小策略,自动调整控件的大小。

QWidget *window = new QWidget;
QPushButton *button1 = new QPushButton("Button 1");
QPushButton *button2 = new QPushButton("Button 2");
QPushButton *button3 = new QPushButton("Button 3");

QHBoxLayout *layout = new QHBoxLayout;
layout->addWidget(button1);
layout->addWidget(button2);
layout->addWidget(button3);

window->setLayout(layout);
window->show();

在此示例中,三个按钮会被水平排列。如果窗口大小发生变化,按钮的大小将自动调整。
在这里插入图片描述

2.2. QVBoxLayout(垂直布局)

QVBoxLayout 将控件从上到下垂直排列,类似于 QHBoxLayout,但方向不同。

QWidget *window = new QWidget;
QPushButton *button1 = new QPushButton("Button 1");
QPushButton *button2 = new QPushButton("Button 2");
QPushButton *button3 = new QPushButton("Button 3");

QVBoxLayout *layout = new QVBoxLayout;
layout->addWidget(button1);
layout->addWidget(button2);
layout->addWidget(button3);

window->setLayout(layout);
window->show();

在此示例中,按钮会被垂直排列。

在这里插入图片描述

2.3. QGridLayout(网格布局)

QGridLayout 提供了类似于表格的布局,可以将控件放置在网格的指定行和列中。它允许更灵活的布局结构,适合用于需要更复杂控件排列的窗口。

QWidget *window = new QWidget;
QPushButton *button1 = new QPushButton("Button 1");
QPushButton *button2 = new QPushButton("Button 2");
QPushButton *button3 = new QPushButton("Button 3");
QPushButton *button4 = new QPushButton("Button 4");

QGridLayout *layout = new QGridLayout;
layout->addWidget(button1, 0, 0); // 放在第0行第0列
layout->addWidget(button2, 0, 1); // 放在第0行第1列
layout->addWidget(button3, 1, 0); // 放在第1行第0列
layout->addWidget(button4, 1, 1); // 放在第1行第1列

window->setLayout(layout);
window->show();

在此示例中,四个按钮会被排列成一个 2x2 的网格。

在这里插入图片描述

2.4. QFormLayout(表单布局)

QFormLayout 是专门用于表单布局的,它将标签和值控件成对排列。每一行通常有两个控件:标签和输入控件(如 QLineEdit)。

QWidget *window = new QWidget;
QLabel *nameLabel = new QLabel("Name:");
QLineEdit *nameEdit = new QLineEdit;

QLabel *ageLabel = new QLabel("Age:");
QLineEdit *ageEdit = new QLineEdit;

QFormLayout *layout = new QFormLayout;
layout->addRow(nameLabel, nameEdit);
layout->addRow(ageLabel, ageEdit);

window->setLayout(layout);
window->show();

在此示例中,表单会将“Name”和“Age”标签与对应的输入框垂直排列。
在这里插入图片描述

2.5. QSplitter (分裂器布局)

QSplitter 可以动态更改页面尺寸,方便页面显示不全,拖动查看页面。

this->setFixedWidth(600);
this->setFixedHeight(400);

QHBoxLayout *layout = new QHBoxLayout();

QSplitter * pHSplitter = new QSplitter(Qt::Horizontal);
//===========水平分裂器左边元素============
QWidget  *lWidget = new QWidget();
lWidget->setMinimumWidth(100);
lWidget->setStyleSheet("QWidget{background:red}");

//===========加入水平分裂器===============
pHSplitter->addWidget(lWidget);


//===========水平分裂器右边元素===============

//===========垂直分裂器==========
QSplitter * pVSplitter = new QSplitter(Qt::Vertical);
pVSplitter->setMinimumWidth(200);
QWidget  *tWidget = new QWidget();
QWidget  *bWidget = new QWidget();
tWidget->setStyleSheet("QWidget{background:blue}");
bWidget->setStyleSheet("QWidget{background:pink}");
pVSplitter->addWidget(tWidget);
pVSplitter->addWidget(bWidget);

//===========加入水平分裂器===============
pHSplitter->addWidget(pVSplitter);
//水平分裂器加入外部布局
layout->addWidget(pHSplitter);
//布局加入主界面
setLayout(layout);

在这里插入图片描述

3. 布局嵌套

你可以嵌套布局来创建更复杂的布局。例如,可以在一个 QVBoxLayout 中嵌入多个 QHBoxLayout:

QWidget *window = new QWidget;

QHBoxLayout *topLayout = new QHBoxLayout;
topLayout->addWidget(new QPushButton("Button 1"));
topLayout->addWidget(new QPushButton("Button 2"));

QHBoxLayout *bottomLayout = new QHBoxLayout;
bottomLayout->addWidget(new QPushButton("Button 3"));
bottomLayout->addWidget(new QPushButton("Button 4"));

QVBoxLayout *mainLayout = new QVBoxLayout;
mainLayout->addLayout(topLayout);  // 上面的水平布局
mainLayout->addLayout(bottomLayout);  // 下面的水平布局

window->setLayout(mainLayout);
window->show();

在此示例中,按钮将分为两行,每行有两个按钮。

4. 控制控件的大小与伸缩性

在 Qt 中,可以通过 setSizePolicy() 函数来控制控件的大小策略,定义它们如何在布局中缩放和调整大小。

  • 常用的 QSizePolicy 枚举值:
QSizePolicy::Fixed:控件保持其初始大小。
QSizePolicy::Expanding:控件尽可能扩展来填充可用空间。
QSizePolicy::Minimum:控件保持其最小大小。
  • 示例:
QPushButton *button = new QPushButton("Button");
button->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);  // 水平扩展,垂直固定

5. 使用布局间距和边距

可以通过 setSpacing() 和 setContentsMargins() 来调整控件之间的间距和布局边缘。

setSpacing(int spacing):设置布局中控件之间的间距。
setContentsMargins(int left, int top, int right, int bottom):设置布局周围的边距。
  • 示例:
QVBoxLayout *layout = new QVBoxLayout;
layout->setSpacing(10);  // 控件之间的间距
layout->setContentsMargins(5, 5, 5, 5);  // 布局与窗口之间的边距

6. 动态调整布局

在运行时,布局可以根据窗口大小的变化动态调整控件的大小和位置。例如,使用 resizeEvent() 可以处理窗口调整大小事件,并相应地调整控件的布局。

7. 使用布局设计器

Qt 的 Qt Designer 是一个图形化工具,允许你以可视化方式设计布局。它支持拖放控件并自动生成布局代码。在 Qt Designer 中创建的 .ui 文件可以在 C++ 代码中通过 uic 工具或 QWidget 加载。

8. 自定义布局

在某些情况下,默认的布局类可能无法满足需求。可以通过继承 QLayout 来创建自定义布局,重写其中的 setGeometry() 和 sizeHint() 函数,来实现特殊的布局逻辑。

9. 布局管理器的优点

自动调整大小:布局管理器会根据窗口的大小自动调整控件的大小和位置。
跨平台一致性:布局管理器确保应用程序在不同平台上具有一致的外观。
简化代码:通过使用布局管理器,避免手动调整控件的位置和大小。

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

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

相关文章

MybatisWebApp

如何构建一个有关Mybatis的Web&#xff1f; 在这里给出我自己的一些配置。我的TomCat版本&#xff1a;10.1.28 &#xff0c;IDEA版本&#xff1a;2024.1.4 Pom.XML文件 <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/200…

小米电机与STM32——CAN通信

背景介绍&#xff1a;为了利用小米电机&#xff0c;搭建机械臂的关节&#xff0c;需要学习小米电机的使用方法。计划采用STM32驱动小米电机&#xff0c;实现指定运动&#xff0c;为此需要了解他们之间的通信方式&#xff0c;指令写入方法等。花了很多时间学习&#xff0c;但网络…

Solidity优质例子(二)物流的增删改查智能合约(附truffle测试)

本合约非常适合新手学习&#xff0c;其包含了基本的增删改查功能以及各个方式的不同之处的总结&#xff0c;本套合约我也编写了truffle测试&#xff0c;学习truffle测试的小伙伴也有福了~ 该合约的主要作用是通过区块链技术实现物流追踪系统的透明化、自动化与防篡改特性&#…

AES对称加密算法

AES&#xff08;Advanced Encryption Standard&#xff09;是取代DES而成为新标准的一种对称加密算法。在全世界提交的众多对称加密算法的候选中&#xff0c;其中有一个名为Rijndael的对称加密算法&#xff0c;将其命名为AES。 整体流程 分组长度 在AES中&#xff0c;分组长度…

Linux:信号保存与处理

使用kill -l命令查看信号&#xff1a; 信号量和信号确实一点关系没有 信号是操作系统发出的进程与进程之间的通知于中断&#xff0c;是进程之间时间异步通知的一种方式 先了解同步通信&#xff1a;同步通信是一种比特同步通信技术&#xff0c;要求发收双方具有同频同相的同步…

若依框架篇-若依框架搭建具体过程、后端源代码分析、功能详解(权限控制、数据字典、定时任务、代码生成、表单构建、接口测试)

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 若依框架概述 1.1 若依构建 1.2 后端项目搭建 1.3 前端项目搭建 2.0 利用若依框架生成前后端代码案例 3.0 功能详解 3.1 功能详解 - 权限控制 3.1.1 使用权限控制…

Djang学习- URL反转

代码中url书写规范&#xff1a; 、 url反向解析 urls: path(test/url, views.test_url),path(test_result/<int:age>, views.test_result, name"rl") views: def test_url(request):return render(request, test_url.html)def test_result(request,age):re…

Lintcode 3686 · N 叉树的直径【中等 DFS/BFS java答案】

题目 题目链接&#xff1a;https://www.lintcode.com/problem/3686/ 思路 1.利用map创建图 2.找到直径的其中一个端点last,通过bfs可以实现 3.从last出发&#xff0c;再次bfs,有多少层&#xff0c;直径就是多少Java代码 /*** Definition for Undirected graph.* class Undir…

100. UE5 GAS RPG 显示范围魔法的攻击范围

在这一篇里&#xff0c;我们将制作一个范围魔法&#xff0c;释放魔法时&#xff0c;我们将在鼠标拾取位置绘制一个魔法光圈&#xff0c;用于显示技能释放时攻击的范围&#xff0c;然后再次点击可以释放技能。 创建贴花类 魔法范围标识的光圈&#xff0c;我们采用贴花实现&…

2014年国赛高教杯数学建模B题创意平板折叠桌解题全过程文档及程序

2014年国赛高教杯数学建模 B题 创意平板折叠桌 某公司生产一种可折叠的桌子&#xff0c;桌面呈圆形&#xff0c;桌腿随着铰链的活动可以平摊成一张平板&#xff08;如图1-2所示&#xff09;。桌腿由若干根木条组成&#xff0c;分成两组&#xff0c;每组各用一根钢筋将木条连接…

44 C 语言输入输出流、scanf 与 printf 函数详解、清除输入缓冲区

目录 1 文件基本介绍 1.1 文件的主要功能 1.2 输入输出流 2 C 语言中的输入与输出 2.1 输入 2.2 输出 2.3 标准文件与文件指针 3 scanf() 函数详解 3.1 功能描述 3.2 函数原型 3.3 常用格式说明符 3.4 返回值 3.5 注意事项 3.5.1 处理空白字符 3.5.2 防止缓冲区…

Linux命令进阶

grep 从文件中搜索字符串 grep "字符串" 文件 参数&#xff1a; -n 显示行号 -R 递归及子目录例如 grep "hello" log.c grep "main" * -nRfind 在指定路径下搜索文件 find 路径 -name 文件名find /home/linux -name hello.c //在/home/linux…

精选优质不收费数据恢复软件全解析

数据已经成为了我们生活和工作中无比珍贵的资产。然而我们在使用中总会因为各种意外导致数据丢失。今天&#xff0c;我们就来深入了解一些优秀的不收费的数据恢复软件&#xff0c;看看他们如果帮我们力挽狂澜。 1.福晰数据恢复 链接直达&#xff1a;https://www.pdf365.cn/fo…

基于Arduino的简易收音机

DIY FM收音机&#xff1a;使用Arduino和Si4703模块打造 引言 在本项目中&#xff0c;我们将使用Arduino Nano和Si4703 FM调谐模块来构建一个功能完备的FM收音机接收器。这个易于跟随的指南非常适合想要深入无线电频率和无线通信世界的业余爱好者和电子爱好者。 Si4703模块是…

西门子网络程序传输,无需开通网络驱动器直接接入底层,支持各类数控 如发那科、三菱 、新代、海德汉、广数、精雕、马扎克等等

有关西门子的程序传输问题&#xff0c;大家一般是通过文件共享、ftp、网络驱动器等方式&#xff0c;其中828D还需要授权开通网络启动器 下面介绍一种方式直接进入西门子Linux底层系统实现和NCK的文件交互功能 软件截图如下 功能表如下 机床程序上载至电脑 电脑程序下传…

2. MySQL数据库基础

一、数据库的操作 1. 显示当前的数据库 SHOW DATABASES;2. 创建数据库 语法&#xff1a; CREATE DATABASE [IF NOT EXISTS] db_name [create_specification...];//create_specification包括&#xff1a;[DEFAULT] CHARACTER SET charset_name[DEFAULT] COLLATE collation_n…

性能测试最佳实践的思考

性能测试是软件开发和应用过程中至关重要的环节。它是评估系统性能、稳定性和可扩展性的有效手段&#xff0c;可以确保软件在真实环境中高效运行。在现代技术快速发展的时代&#xff0c;性能测试的重要性愈发显著。 性能测试在软件开发和应用过程中的重要性不可低估。它是保障…

RabbitMQ消息队列MQ脑裂(网络分区)整理分析

文章目录 RabbitMQ 的集群架构基础什么是MQ脑裂检测网络分区RabbitMQ 网络分区导致脑裂的原因• 多个节点认为自己是主节点&#xff1a;• 节点间状态不一致&#xff1a;• 集群的不可用性和错误恢复&#xff1a; RabbitMQ 网络分区引发脑裂的常见场景队列镜像不同步HA&#xf…

【H2O2|全栈】JS入门知识(二)

目录 JS 前言 准备工作 运算符 算数运算符 比较运算符 自增、自减运算符 逻辑运算符 运算符的优先级 分支语句 if-else语句 switch语句 三元表达式 结束语 JS 前言 本系列博客主要分享JavaScript的基础语法知识&#xff0c;本期为第二期&#xff0c;包含一些简…

网络变压器在楼宇电梯控制器中的重要作用

Hqst盈盛&#xff08;华强盛&#xff09;电子导读&#xff1a;今天分享的是网络变压器在楼宇电梯控制器中的重要作用... 网络变压器在楼宇电梯控制器中起着至关重要的作用,工程师总结有以下是其主要应用方面&#xff1a; 一、信号隔离与增强 络变压器可以实现信号的隔离&#…