【Qt】界面布局

Qt常用布局

除Qt Designer支持可视化设计和布局界面之外,Qt 提供了代码方式来进行界面布局,

以下是几种常用的界面布局方式:

  1. 水平布局(QHBoxLayout)和垂直布局(QVBoxLayout):

    • QHBoxLayout和QVBoxLayout分别用于水平和垂直方向上的布局。你可以将QWidget添加到这些布局中,并设置伸展因子(stretch factor)、对齐方式(alignment)、间距(spacing)等。这两种布局是最常见的布局方式,而且效果很好。
  2. 栅格布局(QGridLayout):

    • QGridLayout允许你以行和列的方式来进行布局。你可以指定每个控件所在的行、列以及占据的行数和列数,从而创建一个网格状的布局。
  3. 表单布局(QFormLayout):

    • QFormLayout是用于表单输入的布局管理器,它将标签和输入控件成对地进行布局,非常适合用于输入表单等场景。
  4. 堆叠布局(QStackedLayout):

    • QStackedLayout可以让你在同一个空间内进行多个页面或控件的切换,只显示其中一个控件,常用于实现向导式的页面切换功能。
  5. 网格网格包布局(QGridLayout):

    • QGridLayout 是一个灵活的网格布局,可以非常精确地控制控件的位置以及跨度。

通过合理地选择和使用这些不同类型的布局管理器,可以很方便地实现界面的布局,并且能够很好地适应不同的窗口大小和语言环境。

Qt的UI设计器很方便,为什么还要手写代码?

  1. 定制化需求: UI设计器可以满足许多通用的布局和控件需求,但是当你有一些特殊的、定制化的界面需求时,有时候需要通过手写代码来实现更灵活的布局和交互效果。

  2. 动态创建界面: 当需要动态地在程序运行时创建或修改界面元素时,代码创建界面会更为方便。有时候一个界面的布局需要根据数据或其他条件来动态调整,这时候手写代码比可视化界面更灵活。

  3. 复杂逻辑: 一些复杂的界面逻辑、事件处理、动画效果等可能很难通过UI设计器的可视化工具直接实现,这时候手写代码将更为方便。

  4. 团队协作: 在团队协作中,有时候为了维护代码的一致性和可读性,团队可能会选择采用手写代码的方式来创建界面。

虽然UI设计器提供了很多便利,但是它并不能完全替代手写代码。在实际的软件开发过程中,通常会结合使用UI设计器和手写代码的方式,根据实际需求来选择合适的方式来构建界面。

水平布局

水平布局头文件:#include <QHBoxLayout>
创建水平布局:QHBoxLayout *layout = new QHBoxLayout(父窗口指针);

布局相关方法:

  • addWidget:在布局里添加一个控件
  • addLayout:在布局里添加布局
  • setMargin(int margin):设置布局与其包含的控件之间的间距。
  • setSpacing(int spacing):设置布局内部控件之间的间距(spacing)。
  • addSpacing(int spacing):向布局中添加一个指定宽度的空白区域。
  • addStretch(int stretch = 0):向布局中添加一个伸展因子(stretch factor)。

下面是一个简单的介绍如何在Qt中创建水平布局的步骤:

步骤1:包含必要的头文件

#include <QHBoxLayout>
#include <QLabel>
#include <QLineEdit>
#include <QPushButton>
#include <QWidget>

步骤2:创建父级QWidget

QWidget *parentWidget = new QWidget;

步骤3:创建要放入水平布局中的控件

QLabel *label = new QLabel("Name:");
QLineEdit *lineEdit = new QLineEdit();
QPushButton *button = new QPushButton("Submit");

步骤4:创建水平布局并将控件添加到布局中

QHBoxLayout *layout = new QHBoxLayout;
layout->addWidget(label);
layout->addWidget(lineEdit);
layout->addWidget(button);

步骤5:将水平布局设置为父级QWidget的布局

parentWidget->setLayout(layout);

以上成功创建了一个包含标签、文本框和按钮的水平布局。当将父QWidget放置在窗口或另一个布局管理器中时,水平布局将会被正确显示。

需要注意的是,在把控件加入到布局中时,它们会按加入的顺序从左至右进行排列。如果窗口大小不够大,控件可能会被挤到下一行。这时候可以设置伸展因子使得布局更灵活。

竖直布局

竖直布局头文件:#include <QVBoxLayout>
创建竖直布局:QVBoxLayout *layout = new QVBoxLayout(父窗口指针);

下面是一个简单的介绍如何在Qt中创建竖直布局的步骤:

步骤1:包含必要的头文件

#include <QVBoxLayout>
#include <QLabel>
#include <QLineEdit>
#include <QPushButton>
#include <QWidget>

步骤2:创建父级QWidget

QWidget *parentWidget = new QWidget;

步骤3:创建要放入竖直布局中的控件

QLabel *label1 = new QLabel("Name:");
QLineEdit *lineEdit1 = new QLineEdit();
QLabel *label2 = new QLabel("Email:");
QLineEdit *lineEdit2 = new QLineEdit();
QPushButton *button = new QPushButton("Submit");

步骤4:创建竖直布局并将控件添加到布局中

QVBoxLayout *layout = new QVBoxLayout;
layout->addWidget(label1);
layout->addWidget(lineEdit1);
layout->addWidget(label2);
layout->addWidget(lineEdit2);
layout->addWidget(button);

步骤5:将竖直布局设置为父级QWidget的布局

parentWidget->setLayout(layout);

以上成功创建了一个包含标签、文本框和按钮的竖直布局。当将父QWidget放置在窗口或另一个布局管理器中时,竖直布局将会被正确显示。

与水平布局类似,也可以使用一些布局的方法来调整外边距、内部空白和添加伸展因子等。

栅格布局

使用QGridLayout来创建栅格布局,该布局将控件放置在一个二维网格内,使其在行和列中对齐。

水平布局头文件:#include <QGridLayout>
创建水平布局:QGridLayout* layout = new QGridLayout(父窗口指针);
添加控件:addWidget()
添加布局:addLayout()
设置水平间距:setHorizontalSpacing()
设置垂直间距:setVerticalSpacing()

以下是一个简单的介绍如何在Qt中创建栅格布局的步骤:

步骤1:包含必要的头文件

#include <QGridLayout>
#include <QLabel>
#include <QLineEdit>
#include <QPushButton>
#include <QWidget>

步骤2:创建父级QWidget

QWidget *parentWidget = new QWidget;

步骤3:创建要放入栅格布局中的控件

QLabel *label1 = new QLabel("Name:");
QLineEdit *lineEdit1 = new QLineEdit();
QLabel *label2 = new QLabel("Email:");
QLineEdit *lineEdit2 = new QLineEdit();
QPushButton *button = new QPushButton("Submit");

步骤4:创建栅格布局并将控件添加到布局中

QGridLayout *layout = new QGridLayout;
layout->addWidget(label1, 0, 0);  // 将 label1 放在第 0 行、第 0 列
layout->addWidget(lineEdit1, 0, 1); // 将 lineEdit1 放在第 0 行、第 1 列
layout->addWidget(label2, 1, 0); // 将 label2 放在第 1 行、第 0 列
layout->addWidget(lineEdit2, 1, 1); // 将 lineEdit2 放在第 1 行、第 1 列
layout->addWidget(button, 2, 0, 1, 2); // 将 button 放在第 2 行、第 0 列,并且占据2列

步骤5:将栅格布局设置为父级QWidget的布局

parentWidget->setLayout(layout);

以上创建了一个包含标签、文本框和按钮的栅格布局。当将父QWidget放置在窗口或另一个布局管理器中时,栅格布局将会被正确显示。

栅格布局允许在行和列中对齐控件,并支持控件占据多个单元格。

分裂器布局

在Qt中,可以使用QSplitter类来创建分隔布局,这允许用户在窗口内部拖动分隔器来改变子控件的大小。这对于需要动态调整子控件大小的应用程序非常有用。

下面是一个简单的介绍,介绍如何在Qt中创建一个分隔器布局:

步骤1:需要包含必要的头文件:

#include <QSplitter>
#include <QLabel>
#include <QTextEdit>

步骤2:使用QSplitter类来创建一个分隔器布局,并将要放置在其中的控件添加到分隔器中。

QSplitter *splitter = new QSplitter(Qt::Horizontal); // 创建一个水平分隔器QLabel *label = new QLabel("Left Panel"); // 创建一个标签
QTextEdit *textEdit = new QTextEdit(); // 创建一个文本编辑框splitter->addWidget(label); // 将标签放入分隔器中
splitter->addWidget(textEdit); // 将文本编辑框放入分隔器中

步骤3:将分隔器布局放入窗口的布局中,或者将其设置为窗口的主布局,以便在应用程序中显示出来。

QVBoxLayout *mainLayout = new QVBoxLayout;
mainLayout->addWidget(splitter);
setLayout(mainLayout);

以上,当运行应用程序时,会看到一个可以拖动的分隔器,用来调整左侧和右侧控件的大小。

使用QSplitter可以轻松地创建分隔布局,使得窗口中的控件可以以用户友好的方式进行动态调整大小。

布局删除重构

在Qt中,对于已经创建的布局,如果想要删除并重构它们,可以采取以下步骤:

  1. 删除布局:首先,需要从父级QWidget中删除已经存在的布局。

假设有一个布局对象 layout,可以使用以下代码将其从父级QWidget中删除:

QWidget *parentWidget = ...; // 获取父级QWidget的指针
delete parentWidget->layout(); // 删除父级QWidget上的布局
  1. 清理子控件:在删除布局之后,需要清理掉所有在该布局中的子控件,以确保不会留下任何残余。
QLayout *layout = parentWidget->layout(); // 获取父级QWidget上的布局
QLayoutItem *child;
while ((child = layout->takeAt(0)) != 0) { // 逐个删除布局中的子控件delete child->widget(); // 删除子控件delete child; // 释放子控件所占用的内存
}
  1. 重新构建布局:将删除的布局替换为新的布局。
QVBoxLayout *newLayout = new QVBoxLayout; // 创建一个新的垂直布局
// 添加控件到新布局中
newLayout->addWidget(new QPushButton("New Button"));
newLayout->addWidget(new QLabel("New Label"));
// 将新布局设置为父级QWidget的布局
parentWidget->setLayout(newLayout);

通过上述步骤,可以将现有布局删除并重构为一个全新的布局。这在某些情况下是非常有用的,尤其是在需要动态调整界面布局的情况下。

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

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

相关文章

Redis常用数据结构--Zset

Zset ZADDZCARDZCOUNTZRANGE/ZREVRANGEZRANGEBYSCOREZPOPMAX/ZPOPMINBZPOPMAX/BZPOPMINZRANK/ZREVRANKZSCOREZREMZREMRANGEBYRANKZREMRANGEBYSCOREZINCRBYZINTERSTORE/ZUNIONSTORE内部编码使⽤场景 ZADD 添加或者更新指定的元素以及关联的分数到 zset 中&#xff0c;分数应该符…

如何在 Angular 测试中使用 spy

简介 Jasmine spy 用于跟踪或存根函数或方法。spy 是一种检查函数是否被调用或提供自定义返回值的方法。我们可以使用spy 来测试依赖于服务的组件&#xff0c;并避免实际调用服务的方法来获取值。这有助于保持我们的单元测试专注于测试组件本身的内部而不是其依赖关系。 在本…

空调压缩机补充润滑油的方法

空调压缩机补充润滑油的方法有三种&#xff0c;从吸气截止阀旁边通孔吸入&#xff0c;从加油孔中加入&#xff0c;从曲轴箱下部加入&#xff0c;具体操作步骤如下&#xff1a; 1关闭吸气截止阀&#xff0c;启动压缩机几分钟&#xff0c;将曲轴箱中制冷剂排入冷凝器&#xff0c…

vue2结合electron开发桌面端应用

一、Electron是什么&#xff1f; Electron是一个使用 JavaScript、HTML 和 CSS 构建桌面应用程序的框架。 嵌入 Chromium 和 Node.js 到 二进制的 Electron 。允许您保持一个 JavaScript 代码代码库并创建可在Windows、macOS和Linux上运行的跨平台应用 。 Electron 经常与 Ch…

scrapy 中间件

就是发送请求的时候&#xff0c;会经过&#xff0c;中间件。中间件会处理&#xff0c;你的请求 下面是代码&#xff1a; # Define here the models for your spider middleware # # See documentation in: # https://docs.scrapy.org/en/latest/topics/spider-middleware.html…

【快速上手ProtoBuf】基本使用

文章目录 1 :peach:初识 ProtoBuf:peach:1.1 :apple:序列化概念:apple:1.2 :apple:ProtoBuf 是什么:apple:1.3 :apple:ProtoBuf 的使用特点:apple: 2 :peach:创建 .proto ⽂件:peach:3 :peach:编译 .proto 文件:peach:3 :peach:序列化与反序列化的使用:peach: 1 &#x1f351;初…

洛谷 2036.PERKET

采用递归法的方式进行题解。 思路&#xff1a;首先我们知道在n种材料当中&#xff0c;我们需要从中选择至少有一种得配料才行。也就是说&#xff0c;我们选择的配料数目是自己决定的&#xff0c;而不是那种组合型得对于你有要求的组合型递归方式。 所以我们会想到用指数型得递…

(五)网络优化与超参数选择--九五小庞

网络容量 网络中神经单元数越多&#xff0c;层数越多&#xff0c;神经网路的拟合能力越强。但是训练速度&#xff0c;难度越大&#xff0c;越容易产生过拟合。 如何选择超参数 所谓超参数&#xff0c;也就是搭建神经网路中&#xff0c;需要我们自己去选择&#xff08;不是通…

LeetCode 刷题 [C++] 第45题.跳跃游戏 II

题目描述 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说&#xff0c;如果你在 nums[i] 处&#xff0c;你可以跳转到任意 nums[i j] 处: 0 < j < nums[i]i j < n 返回到达 nums[n …

递归函数(c++题解)

题目描述 对于一个递归函数w(a, b, c)。 如果a < 0 or b < 0 or c < 0就返回值1。 如果a > 20 or b > 20 or c > 20就返回W(20,20,20)。 如果a < b并且b < c 就返回w(a, b, c − 1) w(a, b − 1, c − 1) − w(a, b − 1, c)&#xff0c; 其它别…

计算机网络知多少-第1篇

一、 从输入URL到页面展示到底发生了什么&#xff1f; 1. 首先浏览器会查看电脑本地缓存&#xff0c;如果有直接返回&#xff0c;否则需要进行下一步的网络请求。 2. 在网络请求之前&#xff0c;需要先进行DNS解析&#xff0c;来找到请求域名的ip地址。如果是HTTPS请求&#…

【C语言】熟悉文件基础知识

欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗~ 如有错误&#xff0c;欢迎指出~ 文件 为了数据持久化保存&#xff0c;使用文件&#xff0c;否则数据存储在内存中&#xff0c;程序退出&#xff0c;内存回收&#xff0c;数据就会丢失。 程序设计中&…

微信小程序,h5端自适应登陆方式

微信小程序端只显示登陆(获取opid),h5端显示通过账户密码登陆 例如: 通过下面的变量控制: const isWeixin ref(false); // #ifdef MP-WEIXIN isWeixin.value true; // #endif

Git 查看提交历史

命令说明git log查看历史提交记录git blame (file)以列表形式查看指定文件的历史修改记录 git log 在使用 Git 提交了若干更新之后&#xff0c;又或者克隆了某个项目&#xff0c;想回顾下提交历史&#xff0c;我们可以使用 git log 命令查看。 git log 命令用于查看 Git 仓库中…

LIN基础:从LIN Frame开始

目录&#xff1a; 1、LIN的网络拓扑 2、LIN Frame 1&#xff09;Header 2&#xff09;Response 3、LIN的通信规则 1&#xff09;LIN的发送行为示例 2&#xff09;LIN的接收行为示例 虽然LIN总线的通信速率不高&#xff0c;工程中&#xff0c;最高的速率也就19200bps。…

c语言extern关键字

extern 是C和C中的关键字&#xff0c;用于声明一个变量或函数的存在&#xff0c;但不进行定义。 它通常用于在一个源文件中引用另一个源文件中定义的变量或函数。 例如&#xff0c;extern int x; 表示 x 是一个整数变量&#xff0c;但它的实际定义将在其他文件中。在引用它的文…

StarRocks——Stream Load 事务接口实现原理

目录 前言 一、StarRocks 数据导入 二、StarRocks 事务写入原理 三、InLong 实时写入StarRocks原理 3.1 InLong概述 3.2 基本原理 3.3 详细流程 3.3.1 任务写入数据 3.3.2 任务保存检查点 3.3.3 任务如何确认保存点成功 3.3.4 任务如何初始化 3.4 Exactly Once 保证…

Leetcode - 周赛386

目录 一&#xff0c;3046. 分割数组 二&#xff0c;3047. 求交集区域内的最大正方形面积 三&#xff0c;3048. 标记所有下标的最早秒数 I 四&#xff0c;3049. 标记所有下标的最早秒数 II 一&#xff0c;3046. 分割数组 将题目给的数组nums分成两个数组&#xff0c;且这两个…

探索RedisJSON:将JSON数据力量带入Redis世界

探索RedisJSON&#xff1a;将JSON数据力量带入Redis世界 当我们谈论数据存储和查询时&#xff0c;Redis和JSON都是无法忽视的重要角色。Redis以其高效的键值存储、快速的读/写速度、以及丰富的数据结构赢得了开发者的喜爱。而JSON&#xff0c;作为一种轻量级的数据交换格式&am…

「Vue3系列」Vue3 条件语句/循环语句

文章目录 一、Vue3 条件语句1. v-if2. v-else-if 和 v-else3. v-show4. 使用计算属性进行条件渲染5. v-if与v-show比较v-ifv-show性能考虑使用场景 二、Vue3 循环语句1. 遍历数组2. 遍历对象3. 使用索引4. 注意事项 三、相关链接 一、Vue3 条件语句 在 Vue 3 中&#xff0c;你…