Qt 实战(5)布局管理器 | 5.2、深入解析Qt布局管理器

文章目录

  • 一、深入解析Qt布局管理器
    • 1、为什么要使用布局管理器?
    • 2、布局管理器类型
    • 3、布局管理器用法详解
      • 3.1、QBoxLayout(垂直与水平布局)
      • 3.2、QGridLayout(网格布局)
      • 3.3、QFormLayout(表单布局)
      • 3.4、QStackedLayout(分组布局管理器)
    • 4、总结

前言:

在Qt框架中,布局管理器(Layout Manager)是一个强大的工具,用于动态调整和管理窗口部件(widgets)的位置和大小。随着用户调整窗口大小或在不同分辨率和DPI(每英寸点数)的屏幕上运行程序,布局管理器能够自动调整其内部部件的排列,确保界面的一致性和可读性。本文将详细介绍Qt中的布局管理器,并探讨其使用方法和最佳实践。

一、深入解析Qt布局管理器

1、为什么要使用布局管理器?

在Qt中,窗口部件(widgets)是用户界面的基本构建块,如按钮、文本框、标签等。然而,仅仅将这些部件简单地放置在窗口中并不足以创建一个功能完善且易于使用的用户界面。当窗口大小改变或在不同DPI的屏幕上显示时,这些部件可能会变得混乱或难以辨认。

为了解决这个问题,Qt引入了布局管理器。布局管理器是一种特殊的窗口部件,它负责控制其内部部件的排列和大小。当窗口大小改变时,布局管理器会自动调整其内部部件的位置和大小,以保持界面的整洁和一致性。这使得开发人员能够更轻松地创建适应不同设备和分辨率的用户界面。

2、布局管理器类型

Qt提供了几种不同类型的布局管理器,每种都有其独特的特点和适用场景:

  • QHBoxLayout:水平布局管理器,将部件水平排列。它可以根据需要添加间距和对齐方式,使部件在水平方向上均匀分布。
  • QVBoxLayout:垂直布局管理器,将部件垂直排列。与QHBoxLayout类似,它也可以添加间距和对齐方式。
  • QGridLayout:网格布局管理器,将部件放置在二维网格中。它允许开发人员指定行和列的数量,并控制部件在网格中的位置和对齐方式。
  • QFormLayout:表单布局管理器,通常用于创建表单界面。它可以将标签(QLabel)和字段(如QTextEdit、QLineEdit等)配对,并自动调整它们的位置和大小。
  • QStackedLayout:堆叠布局管理器,将多个部件堆叠在一起,但一次只显示一个部件。它通常用于实现选项卡(tab)或向导(wizard)界面。

Qt 共提供了 5 种布局管理器,每种布局管理器对应一个类,分别是 QVBoxLayoutQHBoxLayoutQGridLayoutQFormLayoutQStackedLayout,继承关系如下图:

在这里插入图片描述

3、布局管理器用法详解

3.1、QBoxLayout(垂直与水平布局)

垂直布局管理器常用操作,如下:

// 1、添加控件
void addWidget(QWidget *widget, int stretch = 0, Qt::Alignment alignment = Qt::Alignment())

// 2、添加子布局
void addLayout(QLayout *layout, int stretch = 0)

// 3、设置边界
void setContentsMargins(int left, int top, int right, int bottom)
void setMargin(int margin)

// 4、设置间距
void addSpacing(int size)    // 设置固定间隔
void addStretch(int stretch = 0)    // 设置可伸缩间距,stretch是伸缩因子

// 5、设置布局方向
void setDirection(Direction direction)

// 6、设置拉伸系数
void setStretch(int index, int stretch)
bool setStretchFactor(QWidget *widget, int stretch)
bool setStretchFactor(QLayout *layout, int stretch)

// 7、设置布局策略
void setSizeConstraint(SizeConstraint)

3.2、QGridLayout(网格布局)

网格布局管理器常用操作,如下:

// 1、添加控件
void addWidget(QWidget *widget, int row, int column, Qt::Alignment alignment = Qt::Alignment())
void addWidget(QWidget *widget, int fromRow, int fromColumn, int rowSpan, int columnSpan, 
	Qt::Alignment alignment = Qt::Alignment())

// 2、添加子布局
void addLayout(QLayout *layout, int row, int column, Qt::Alignment alignment = Qt::Alignment())
void addLayout(QLayout *layout, int row, int column, int rowSpan, int columnSpan, 
	Qt::Alignment alignment = Qt::Alignment())

// 3、设置拉伸系数
void setColumnStretch(int column, int stretch)    // 给指定列设置拉伸系数
void setRowStretch(int row, int stretch)    // 给指定行设置拉伸系数

3.3、QFormLayout(表单布局)

表单布局管理器常用操作,如下:

// 1、添加控件
// 将指定的field控件和存储标签的label控件添加到表单控件中的末尾
void addRow(QWidget *label, QWidget *field)    
 // 将指定的 field 控件和 labelText 标签添加到表单控件的末尾
void addRow(const QString &labelText, QWidget *field)   

// 2、设置标签显示格式,默认标签位于控件的左侧
void setRowWrapPolicy(RowWrapPolicy policy)

3.4、QStackedLayout(分组布局管理器)

分组布局管理器常用操作,如下:

// 1、添加控件
int addWidget(QWidget *widget)

// 2、设置显示样式
void setStackingMode(StackingMode stackingMode)

4、总结

Qt布局管理器是创建灵活和可适应不同设备和分辨率的用户界面的关键工具。通过合理地使用不同类型的布局管理器、嵌套布局、间距和对齐方式以及测试不同环境,开发人员可以创建出功能完善且易于使用的用户界面。希望本文能帮助您更深入地了解Qt布局管理器并为您的开发工作提供有用的指导。

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

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

相关文章

LLM2Vec论文阅读笔记

这是篇LLM论文,用decoder-like的LLM去提取embedding文章认为,decoder-like的LLM在text embedding task表现不优的一大原因就是其casual attention mechanism,其实就是mask的问题。所以只要对现有的decoder-only LLM进行如下三步改进&#xff…

接口联调测试

在我们工作过程中,有时需要一些接口进行联调。接口联调测试,就是按照业务要求,把接口进行组合测试。接口组合起来才能实现完整的业务,体现更大的价值。 接口联调测试业务分析: 原因: 项目中的接口是多个…

【数据结构与算法】最小生成树

文章目录 最小生成树(MST)定义 构造最小生成树Prim算法Kruskal算法 最小生成树(MST) 连通图的生成树包含图的所有顶点,并且只含有尽可能少的边。对于生成树来说,若砍去它的一条边,则会使生成树…

DOOPRIME:日本央行7月加息与否取决于数据,购债规模调整无强烈信号

摘要 日本央行行长植田和男近日在议会发言中表示,7月份是否加息将取决于经济数据表现,而购买日本国债与加息是两个独立的问题,不会通过削减购债规模来释放强烈的政策信号。这一表态引发了市场的广泛关注,投资者和经济学家对此进行…

【elementui源码解析】如何实现自动渲染md文档-第四篇

目录 1.前言 2.md-loader - index.js 1)md.render() 2)定义变量 3)while stripTemplate stripScript genInlineComponentText 4)pageScript 5)return 6)demo-block 3.总结 所有章节&#x…

MyBatis逆向工程和MyBatisX插件的使用

文章目录 1.ORM思维2.逆向工程3.MyBatisX插件的使用 1.ORM思维 ORM(Object-Relational Mapping,对象-关系映射)是一种将数据库和面向对象编程语言中的对象之间进行转换的技术。它将对象和关系数据库的概念进行映射,最后我们就可以…

发生了什么?法国市值蒸发超1.8万亿元

KlipC报道:一周前,法国总统马克龙意外宣布提前举行国会议员选举,引发了法国政坛遭受巨震。仅仅一周内,法国股市遭受重大打击,其市值蒸发了约2580亿美元(约1.8万亿人民币)。 多家大型金融机构多…

【Go语言精进之路】构建高效Go程序:了解string实现原理并高效使用

🔥 个人主页:空白诗 🔥 热门专栏:【Go语言精进之路】 文章目录 引言一、Go语言的字符串类型1.1 字符串的定义1.2 字符串的零值可用1.3 字符串的不可变性1.4 字符串的拼接1.5 字符串的常用方法1.6 实际使用示例 二、字符串的内部表…

【Git】多人协作 -- 详解

一、多人协作(1) ⽬前,我们所完成的工作如下: 基本完成 Git 的所有本地库的相关操作,git 基本操作,分支理解,版本回退,冲突解决等等。 申请码云账号,将远端信息 clone…

【牛客面试必刷TOP101】Day33.BM70 兑换零钱(一)和BM71 最长上升子序列(一)

文章目录 前言一、BM70 兑换零钱(一)题目描述题目解析二、BM71 最长上升子序列(一)题目描述题目解析总结 前言 一、BM70 兑换零钱(一) 题目描述 描述: 给定数组arr,arr中所有的值都为正整数且不重复。每个值代表一种面值的货币,每种面值的货币…

数据安全未来之路,天空卫士荣誉领榜《中国数据安全50强(2024)》

《中国数据安全50强(2024)》 数世咨询首份《中国数据安全50强(2024)》报告发布。天空卫士凭借其卓越的技术创新、市场领导力、业务收入能力和企业发展能力,在众多竞争者中脱颖而出,荣登50强榜单&#xff0…

yolov5模型pt转engine

目录 1. 环境准备1.1 安装tensorrt1.1.1 pip安装1.1.2 压缩包安装 2. pt转engine 1. 环境准备 1.1 安装tensorrt 1.1.1 pip安装 pip install tensorrt 1.1.2 压缩包安装 很可能会失败,最保险的方法是下载tensorRT的压缩包,比如:下载Tenso…

分享:2024年(第12届)“泰迪杯”数据挖掘挑战赛省级奖项获奖名单公示

本次竞赛有评选省奖的省份有广东省、广西壮族自治区、河北省、湖北省。各省奖项依据“泰迪杯”全国评审专家组统一评阅的最终成绩区分省份后从高到低依序按比例产生。 广东省 省级奖项获奖名单公示 奖项设置: 一等奖:约占该省份队伍总数的5%&#xff0…

【正则表达式】入门

参考视频:10分钟快速掌握正则表达式_哔哩哔哩_bilibili 这个网站用来测试写的正则表达式效果:regex101: build, test, and debug regex 示例: 限定符 ? 表示前一个字符可有可无 比如这里输入:de? 匹配结果可以得到d和de * 前…

【Android WebView】WebView基础

一、简介 WebView是一个基于webkit引擎、展现web页面的控件。Android的Webview在低版本和高版本采用了不同的webkit版本内核,4.4后直接使用了Chrome。 二、重要类 以WebView类为基础,WebSettings、WebViewClient、WebChromeClient为辅助共同完成安卓段加…

微服务中的相关概念

Eureka Eureka 是由 Netflix 开发的一个服务发现和注册中心,广泛应用于微服务架构中。Eureka 主要用于管理和协调分布式服务的注册和发现,确保各个服务之间能够方便地找到并通信。它是 Netflix OSS(Netflix Open Source Software&#xff09…

指针和数组

同一指针相减的绝对值得到的是之间元素的个数 #include"stdio.h" #include"string.h" int main() {int arr[10]{0};printf("%d\n",&arr[9]- &arr[0]);return 0; } 不同类型的指针减去指针没有意义 地址加地址,指针加指针没…

UE5 C++ 跑酷游戏练习 Part1

一.修改第三人称模板的 Charactor 1.随鼠标将四处看的功能的输入注释掉。 void ARunGANCharacter::SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) {// Set up action bindingsif (UEnhancedInputComponent* EnhancedInputComponent CastChecked&…

【Linux基础IO】常见的对文件操作的函数、文件描述符fd、访问文件的本质分析

目录 fopen函数 chdir函数 fclose函数 fwrite和fread函数 open函数 umask函数 write函数 read函数 close函数 文件描述符fd 进程访问文件的本质分析 fopen函数 参数mode: w方式打开文件:1、如果被打开文件不存在,系统会在使用fopen函…

玄机平台流量特征分析-常见攻击事

前言 熟悉常见的攻击流量特征,我们就可以通过主机的一个流量情况来判断主机遭受了何种攻击。这里来看看玄机平台的一道题目。 步骤1.1 这里需要我们找出恶意扫描者,也就是黑客的ip。下载好附件之后用wiresharke打开,直接筛选http协议的流量…