当前位置: 首页 > news >正文

详解Qt中的布局管理器

Qt中的布局管理是用于组织用户界面中控件(如按钮、文本框、标签等)位置和尺寸调整的一种机制。说白了就是创建了一种规则,随着窗口变化其中的控件大小位置跟着变化。Qt提供了多种布局管理器,每种都有其特定用途和特点。以下是对Qt布局管理的详细说明,以及对应的示例代码:

布局管理器分类与示例

基础布局管理器

  • QHBoxLayout:水平布局,将控件按从左到右的顺序排列。
    示例代码:
QHBoxLayout *horizontalLayout = new QHBoxLayout();
QPushButton *button1 = new QPushButton("Button 1");
QPushButton *button2 = new QPushButton("Button 2");horizontalLayout->addWidget(button1);
horizontalLayout->addWidget(button2);QWidget *containerWidget = new QWidget();
containerWidget->setLayout(horizontalLayout);
  • QVBoxLayout:垂直布局,将控件按从上到下的顺序排列。
    示例代码:
QVBoxLayout *verticalLayout = new QVBoxLayout();
QLabel *label = new QLabel("A Label");
QPushButton *button = new QPushButton("A Button");verticalLayout->addWidget(label);
verticalLayout->addWidget(button);QWidget *containerWidget = new QWidget();
containerWidget->setLayout(verticalLayout);

高级布局管理器

  • QGridLayout:网格布局,将控件放置在二维网格中,可以根据行列位置和跨度来精确控制控件的位置。
    示例代码:
QGridLayout *gridLayout = new QGridLayout();
QLabel *label1 = new QLabel("Label 1");
QLabel *label2 = new QLabel("Label 2");
QPushButton *button = new QPushButton("Button");gridLayout->addWidget(label1, 0, 0);
gridLayout->addWidget(label2, 0, 1, 1, 2); // 跨两列
gridLayout->addWidget(button, 1, 0, 1, 3); // 跨三列QWidget *containerWidget = new QWidget();
containerWidget->setLayout(gridLayout);
  • QFormLayout:表单布局,特别适合创建具有标签-输入字段对齐的表单界面。它可以自动对齐相邻的控件,并支持行间的垂直间隔控制。
    示例代码:
QFormLayout *formLayout = new QFormLayout();
QLabel *nameLabel = new QLabel("Name:");
QLineEdit *nameEdit = new QLineEdit();
QLabel *ageLabel = new QLabel("Age:");
QSpinBox *ageSpinBox = new QSpinBox();formLayout->addRow(nameLabel, nameEdit);
formLayout->addRow(ageLabel, ageSpinBox);QWidget *containerWidget = new QWidget();
containerWidget->setLayout(formLayout);
  • QStackedLayout:堆叠布局,允许在多个子布局或控件之间切换显示,类似于页面切换,只有一个子项在任何时候是可见的。
    示例代码:
QStackedLayout *stackedLayout = new QStackedLayout();
QWidget *page1 = new QWidget();
QWidget *page2 = new QWidget();stackedLayout->addWidget(page1);
stackedLayout->addWidget(page2);QPushButton *button = new QPushButton("Switch Page");
connect(button, &QPushButton::clicked, [stackedLayout](){stackedLayout->setCurrentIndex((stackedLayout->currentIndex() + 1) % stackedLayout->count());
});QVBoxLayout *mainLayout = new QVBoxLayout();
mainLayout->addWidget(button);
mainLayout->addLayout(stackedLayout);QWidget *containerWidget = new QWidget();
containerWidget->setLayout(mainLayout);

动态布局

  • QScrollArea:虽然不是严格意义上的布局管理器,但QScrollArea提供了一个可以容纳任何布局或控件的滚动区域,当内容超出其边界时,会自动显示滚动条。
    示例代码:
QScrollArea *scrollArea = new QScrollArea();
QWidget *contentWidget = new QWidget();
QVBoxLayout *contentLayout = new QVBoxLayout(contentWidget);for (int i = 0; i < 20; ++i) {QLabel *label = new QLabel(QString("Label %1").arg(i));contentLayout->addWidget(label);
}scrollArea->setWidgetResizable(true);
scrollArea->setWidget(contentWidget);QVBoxLayout *mainLayout = new QVBoxLayout();
mainLayout->addWidget(scrollArea);QWidget *containerWidget = new QWidget();
containerWidget->setLayout(mainLayout);
  • QSplitter:分割器,可以将界面划分为多个可调整大小的部分,每个部分可以包含自己的布局或控件。用户可以通过拖动分割线来改变各部分的相对大小。
    示例代码:
QSplitter *splitter = new QSplitter(Qt::Horizontal);
QWidget *leftWidget = new QWidget();
QWidget *rightWidget = new QWidget();QVBoxLayout *leftLayout = new QVBoxLayout(leftWidget);
leftLayout->addWidget(new QLabel("Left Content"));QVBoxLayout *rightLayout = new QVBoxLayout(rightWidget);
rightLayout->addWidget(new QLabel("Right Content"));splitter->addWidget(leftWidget);
splitter->addWidget(rightWidget);QVBoxLayout *mainLayout = new QVBoxLayout();
mainLayout->addWidget(splitter);QWidget *containerWidget = new QWidget();
containerWidget->setLayout(mainLayout);

布局管理器属性与功能

除了上述的基本使用方法,布局管理器还提供了丰富的属性和功能以实现更精细的布局控制:

  • 对齐与间距: 可以设置布局内部控件的对齐方式(如居中、左对齐、顶部对齐等)以及控件之间的水平和垂直间距。
    示例代码(设置水平和垂直间距):
QVBoxLayout *layout = new QVBoxLayout();
layout->setSpacing(10); // 设置垂直间距为10像素
layout->setContentsMargins(5, 5, 5, 5); // 设置四周边距为5像素
  • 伸展因子(Stretch Factors)
    通过设置布局项的伸展因子,可以控制当布局有多余空间时,各控件如何分配额外空间。高伸展因子的控件将获得更大比例的空间。
    示例代码(设置伸展因子):
QHBoxLayout *layout = new QHBoxLayout();
QPushButton *button1 = new QPushButton("Button 1");
QPushButton *button2 = new QPushButton("Button 2");layout->addWidget(button1, 1); // 设置伸展因子为1
layout->addWidget(button2, 2); // 设置伸展因子为2,button2将占据更多水平空间QWidget *containerWidget = new QWidget();
containerWidget->setLayout(layout);
  • 大小约束: 可以设置控件的最大和最小尺寸限制,以确保布局在调整时不会违反这些限制。
    示例代码(设置最大宽度):
QLabel *label = new QLabel("A Label");
label->setMaximumWidth(200); // 设置最大宽度为200像素QVBoxLayout *layout = new QVBoxLayout();
layout->addWidget(label);QWidget *containerWidget = new QWidget();
containerWidget->setLayout(layout);
  • 嵌套布局: 一个布局可以作为另一个布局的子布局,通过嵌套布局可以创建复杂的界面布局。
    示例代码(嵌套布局):
QVBoxLayout *mainLayout = new QVBoxLayout();
QHBoxLayout *topRow = new QHBoxLayout();
QVBoxLayout *bottomRow = new QVBoxLayout();QPushButton *button1 = new QPushButton("Button 1");
QPushButton *button2 = new QPushButton("Button 2");
QLabel *label = new QLabel("A Label");topRow->addWidget(button1);
topRow->addWidget(button2);
bottomRow->addWidget(label);mainLayout->addLayout(topRow);
mainLayout->addLayout(bottomRow);QWidget *containerWidget = new QWidget();
containerWidget->setLayout(mainLayout);

布局管理器使用技巧

  • 避免绝对定位: 都使用布局管理器了,别在手动设置控件的位置和大小,以提高界面的适应性和可维护性。
  • 混合使用布局: 根据界面需求,合理组合使用不同类型的布局,如在一个主垂直布局中嵌套多个水平布局,或者使用网格布局来精确控制复杂表格的布局。
  • 测试不同分辨率与窗口大小: 在多种屏幕分辨率和窗口尺寸下测试布局,确保其在各种情况下都能良好呈现。

相关文章:

详解Qt中的布局管理器

Qt中的布局管理是用于组织用户界面中控件&#xff08;如按钮、文本框、标签等&#xff09;位置和尺寸调整的一种机制。说白了就是创建了一种规则&#xff0c;随着窗口变化其中的控件大小位置跟着变化。Qt提供了多种布局管理器&#xff0c;每种都有其特定用途和特点。以下是对Qt…...

MyBatis 参数重复打印的bug

现象 最近有个需求&#xff0c;需要在mybatis对数据库进行写入操作的时候&#xff0c;根据条件对对象中的某个值进行置空&#xff0c;然后再进行写入&#xff0c;这样数据库中的值就会为空了。 根据网上查看的资料&#xff0c;选择在 StatementHandler 类执行 update 的时候进…...

ES6学习之路:迭代器Iterator和生成器Generator

迭代器 一、知识背景 什么是迭代器 迭代器就是在一个数据集合中不断取出数据的过程迭代和遍历的区别 遍历是把所有数据都取出迭代器注重的是依次取出数据&#xff0c;它不会在意有多少数据&#xff0c;也不会保证能够取出多少或者能够把数据都取完。比如斐波那契额数列&#…...

如何使用 DynamiCrafter Interp Loop 无缝连接两张照片

DynamiCrafter Interp Loop 是一个基于 AI 的工具&#xff0c;可以用来无缝连接两张照片。它使用深度学习技术来生成中间帧&#xff0c;从而使两张照片之间的过渡更加自然流畅。 使用步骤 访问 DynamiCrafter Interp Loop 网站&#xff1a;https://huggingface.co/spaces/Dou…...

今天起,Windows可以一键召唤GPT-4了

ChatGPT狂飙160天&#xff0c;世界已经不是之前的样子。 新建了人工智能中文站https://ai.weoknow.com 每天给大家更新可用的国内可用chatGPT资源 发布在https://it.weoknow.com 更多资源欢迎关注 微软 AI 大计的最后一块拼图完成了&#xff1f; 把 Copilot 按钮放在 Window…...

使用Kaggle API快速下载Kaggle数据集

前言 在使用Kaggle网站下载数据集时&#xff0c;直接在网页上点击下载可能会很慢&#xff0c;甚至会出现下载失败的情况。本文将介绍如何使用Kaggle API快速下载数据集。 具体步骤 安装Kaggle API包 在终端中输入以下命令来安装Kaggle API相关的包&#xff1a; pip install…...

java 通过 microsoft graph 调用outlook(二)

这次提供一些基础调用方式API PS&#xff1a; getMailFolders 接口返回的属性中&#xff0c;包含了未读邮件数量unreadItemCount 一 POM文件 <!-- office 365 --><dependency><groupId>com.google.guava</groupId><artifactId>guava<…...

【机器学习】代价函数

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;机器学习 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进…...

[leetcode] 100. 相同的树

给你两棵二叉树的根节点 p 和 q &#xff0c;编写一个函数来检验这两棵树是否相同。 如果两个树在结构上相同&#xff0c;并且节点具有相同的值&#xff0c;则认为它们是相同的。 示例 1&#xff1a; 输入&#xff1a;p [1,2,3], q [1,2,3] 输出&#xff1a;true示例 2&a…...

08、Lua 函数

Lua 函数 Lua 函数Lua函数主要有两种用途函数定义解析&#xff1a;optional_function_scopefunction_nameargument1, argument2, argument3..., argumentnfunction_bodyresult_params_comma_separated 范例 : 定义一个函数 max()Lua 中函数可以作为参数传递给函数多返回值Lua函…...

【数据分析面试】1. 计算年度收入百分比(SQL)

题目 你需要为公司的营收来源生成一份年度报告。计算截止目前为止&#xff0c;在表格中记录的第一年和最后一年所创造的总收入百分比。将百分比四舍五入到两位小数。 示例&#xff1a; 输入&#xff1a; annual_payments 表 列名类型amountINTEGERcreated_atDATETIMEstatusV…...

数据库SQL语句速查手册

SQL 语句语法AND / ORSELECT column_name(s) FROM table_name WHERE condition AND|OR conditionALTER TABLEALTER TABLE table_name ADD column_name datatypeorALTER TABLE table_name DROP COLUMN column_nameAS (alias)SELECT column_name AS column_alias FROM table_name…...

智慧城市一屏统览,数字孪生综合治理

现代城市作为一个复杂系统&#xff0c;牵一发而动全身&#xff0c;城市化进程中产生新的矛盾和社会问题都会影响整个城市系统的正常运转。智慧城市是应对这些问题的策略之一。城市工作要树立系统思维&#xff0c;从构成城市诸多要素、结构、功能等方面入手&#xff0c;系统推进…...

Python读取PDF文字转txt,解决分栏识别问题,能读两栏

搜索了一下&#xff0c;大致有这些库能将PDF转txt 1. PyPDF/PyPDF2&#xff08;截止2024.03.28这两个已经合并成了一个&#xff09;pypdf PyPI 2. pdfplumber GitHub - jsvine/pdfplumber: Plumb a PDF for detailed information about each char, rectangle, line, et cete…...

微信支付平台与微信服务号关联配置要点

目录 JSAPI支付 前期资料及相关准备 申请微信服务号 服务号配置要点 微信认证 基本配置 功能设置 申请微信支付号 支付号配置要点 设置操作密码 API安全 开发设置 与服务号关联 小结 JSAPI支付 我们的开发应用场景以JSAPI支付为举例&#xff0c;这也是常用的一…...

C++类复习

C类 1. 类内成员函数隐式声明为inline class Str {int x;int y 3; public:inline void fun(){std::cout<<"pf,yes!"<<std::endl;} };这段代码不会报错&#xff0c;但是类内的成员函数隐式声明为inline函数&#xff0c;不需要单独写在前面。因此将成员…...

Spring使用(一)注解

Spring使用 资源 Spring 框架内部使用 Resource 接口作为所有资源的抽象和访问接口&#xff0c;在上一篇文章的示例代码中的配置文件是通过ClassPathResource 进行封装的&#xff0c;ClassPathResource 是 Resource 的一个特定类型的实现&#xff0c;代表的是位于 classpath …...

Linux基本指令篇

在前边&#xff0c;我们已经了解过了Linux操作系统的发展和应用&#xff0c;从该篇起&#xff0c;就正式进入对Linux的学习。 今天我们就来在Xshell上远程登录我们的云服务器。首先我们要知道自己云服务器的公网ip&#xff0c;然后修改一下密码。 点击跳转 修改完密码之后我们…...

CSS实现小车旅行动画实现

小车旅行动画实现 效果展示 CSS 知识点 灵活使用 background 属性下的 repeating-linear-gradient 实现路面效果灵活运用 animation 属性与 transform 实现小车和其他元素的动画效果 动画场景分析 从效果图可以看出需要实现此动画的话&#xff0c;需要position属性控制元素…...

6_相机坐标系_相机4个坐标系详述

相机系列文章是用来记录使用opencv3来完成单目相机和6轴机械臂手眼标定。本人吃饭的主职是linux下6轴机械臂相关应用开发。但对于机械臂运动学、相机应用等都非常感兴趣&#xff0c;所以对一些线性代数基础薄弱又想深入了解机械臂内部运算的同志比较有体会。由于是探索性学习&a…...

浅谈 React Hooks

React Hooks 是 React 16.8 引入的一组 API&#xff0c;用于在函数组件中使用 state 和其他 React 特性&#xff08;例如生命周期方法、context 等&#xff09;。Hooks 通过简洁的函数接口&#xff0c;解决了状态与 UI 的高度解耦&#xff0c;通过函数式编程范式实现更灵活 Rea…...

大话软工笔记—需求分析概述

需求分析&#xff0c;就是要对需求调研收集到的资料信息逐个地进行拆分、研究&#xff0c;从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要&#xff0c;后续设计的依据主要来自于需求分析的成果&#xff0c;包括: 项目的目的…...

进程地址空间(比特课总结)

一、进程地址空间 1. 环境变量 1 &#xff09;⽤户级环境变量与系统级环境变量 全局属性&#xff1a;环境变量具有全局属性&#xff0c;会被⼦进程继承。例如当bash启动⼦进程时&#xff0c;环 境变量会⾃动传递给⼦进程。 本地变量限制&#xff1a;本地变量只在当前进程(ba…...

DAY 47

三、通道注意力 3.1 通道注意力的定义 # 新增&#xff1a;通道注意力模块&#xff08;SE模块&#xff09; class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

django filter 统计数量 按属性去重

在Django中&#xff0c;如果你想要根据某个属性对查询集进行去重并统计数量&#xff0c;你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求&#xff1a; 方法1&#xff1a;使用annotate()和Count 假设你有一个模型Item&#xff0c;并且你想…...

均衡后的SNRSINR

本文主要摘自参考文献中的前两篇&#xff0c;相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程&#xff0c;其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt​ 根发送天线&#xff0c; n r n_r nr​ 根接收天线的 MIMO 系…...

动态 Web 开发技术入门篇

一、HTTP 协议核心 1.1 HTTP 基础 协议全称 &#xff1a;HyperText Transfer Protocol&#xff08;超文本传输协议&#xff09; 默认端口 &#xff1a;HTTP 使用 80 端口&#xff0c;HTTPS 使用 443 端口。 请求方法 &#xff1a; GET &#xff1a;用于获取资源&#xff0c;…...

【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)

前言&#xff1a; 双亲委派机制对于面试这块来说非常重要&#xff0c;在实际开发中也是经常遇见需要打破双亲委派的需求&#xff0c;今天我们一起来探索一下什么是双亲委派机制&#xff0c;在此之前我们先介绍一下类的加载器。 目录 ​编辑 前言&#xff1a; 类加载器 1. …...

Win系统权限提升篇UAC绕过DLL劫持未引号路径可控服务全检项目

应用场景&#xff1a; 1、常规某个机器被钓鱼后门攻击后&#xff0c;我们需要做更高权限操作或权限维持等。 2、内网域中某个机器被钓鱼后门攻击后&#xff0c;我们需要对后续内网域做安全测试。 #Win10&11-BypassUAC自动提权-MSF&UACME 为了远程执行目标的exe或者b…...

RushDB开源程序 是现代应用程序和 AI 的即时数据库。建立在 Neo4j 之上

一、软件介绍 文末提供程序和源码下载 RushDB 改变了您处理图形数据的方式 — 不需要 Schema&#xff0c;不需要复杂的查询&#xff0c;只需推送数据即可。 二、Key Features ✨ 主要特点 Instant Setup: Be productive in seconds, not days 即时设置 &#xff1a;在几秒钟…...