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

news2024/9/27 21:29:02

布局管理(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
    • 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 }
    • main.cpp

      • 由新建项目时生成,无改动
  • 运行效果

    • 在 hWidget 中添加了 3 个水平排布的按钮,在 vWidget
      中添加了 3 个垂直排布的按钮

(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
      • 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 }
      • 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
      • 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 }
      • main.cpp

        • 由新建项目时生成,无改动
    • 运行效果

      • 在 fWidget 中添加了两行,同时设置了它们的间隔,与距边框的宽度。与 QGirdLayout 布局比较,QFomLayout 布局比较适用于行与列比较少的布局格局。如果是多行多列的布局,应该使用 QGirdLayout 布局

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

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

相关文章

宏定义———C语言

*符号代表全部的意思*.i代表的是全部的点i文件 宏定义 &#xff1a; 1.定义&#xff1a; #define 宏名 常量功能&#xff1a;宏名代替常量&#xff0c;宏名要求全大写且见名知义 2.示例&#xff1a; #include <stdio.h> #define PI 3.14 #define Q 4 #define P QQi…

Ubuntu系统+宝塔面板部署Frp内网穿透服务

一、搭建目的 上次在局域网中搭建了自己的个人网盘之后&#xff0c;上传文件、照片都很方便&#xff0c;但是只能限制在内网中访问&#xff01;所以这次再搭建一个内网穿透服务器&#xff0c;这样不管在哪里都能访问到家里的云盘&#xff01; 二、内网穿透Frp是什么&#xff1…

连接一切:Web3如何推动物联网的发展

物联网面临的挑战 物联网&#xff08;IoT&#xff09;作为现代科技的重要组成部分&#xff0c;通过将各种智能设备和系统互联&#xff0c;正在以惊人的速度改变我们的生活方式。从智能家居到智慧城市&#xff0c;物联网的应用无处不在。然而&#xff0c;随着设备数量的急剧增加…

华为---端口隔离简介和示例配置

目录 1. 端口隔离概念 2. 端口隔离作用 3. 端口隔离优点 4. 端口隔离缺点 5. 端口隔离的方法和应用场景 6. 端口隔离配置 6.1 端口隔离相关配置命令 6.2 端口隔离配置思路 7. 示例配置 7.1 示例场景 7.2 网络拓扑图 7.3 基本配置 7.4端口隔离配置与验证 7.4.1 双…

初识--树(1)

下面就是这篇博客要讲的内容 树 二叉树堆 树概念及结构二叉树的概念及结构二叉树的实现堆的概念及运用 这篇博客主要以二叉树为主要内容。 1、树的概念及结构 1.1树的概念&#xff1a; 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限…

C语言 - 构造类型

构造类型&#xff1a; 数据类型的分类&#xff1a; 基本类型&#xff1a;整数型&#xff1a;短整型&#xff08;short&#xff09;、整型&#xff08;int&#xff09;、长整型&#xff08;long&#xff09;、长长整型&#xff08;long long&#xff09; 浮点型&#xff1a;单…

Java | Leetcode Java题解之第336题回文对

题目&#xff1a; 题解&#xff1a; class Solution {public List<List<Integer>> palindromePairs(String[] words) {List<List<Integer>> ans new ArrayList<>();int n words.length;for (int i 0; i < n; i) {for (int j 0; j < n…

让科技党狂喜的电动车什么样,新日凯迪拉氮,你值得拥有!

这些年电动车企为了创新可以说“八仙过海&#xff0c;各显神通”&#xff0c;有的深挖智能技术开辟新赛道&#xff0c;有的狂卷性能卷出新场景。然而&#xff0c;真正触动消费者心弦的是&#xff1a;如何实实在在地提升骑行体验。正是洞察了这一核心需求&#xff0c;新日电动车…

如何进行屏幕录制?有哪些免费的录屏软件推荐?

如何进行屏幕录制&#xff1f;有哪些免费的录屏软件推荐&#xff1f; 对于内容创作者、教育工作者和游戏玩家来说。精通屏幕录制技术已成为一项不可或缺的技能&#xff01;本文将深入探讨如何使用市面上的顶级屏幕录制软件&#xff0c;例如嗨格式录屏大师和OBS Studio&#xff…

hyper-v安装window10操作系统

Hyper-V是微软的一款虚拟化产品&#xff0c;是微软第一个采用类似Vmware ESXi和Citrix Xen的基于hypervisor的技术。 目标&#xff1a;在window10的物理机上基于hyper-v运行虚拟window10。 准备条件 准备好window10操作系统&#xff0c;iso、wim、esd等都行&#xff0c;我这…

侧向开敞式通风天窗的设计特点和优势

一、特点 1、侧向开启&#xff1a;与传统的顶开型窗户相比&#xff0c;侧向开敞式通风天窗采用侧向开启的方式&#xff0c;这种设计不仅为室内提供了更大的通风面积&#xff0c;还使得空气流动更加顺畅。 2、防雨功能&#xff1a;设计时考虑防雨需求&#xff0c;能够在下雨时保…

如何在C++ QT 程序中集成cef3浏览器组件去显示网页?

目录 1、问题描述 2、为什么选择cef3浏览器组件 3、cef3组件的介绍与下载 4、将cef3组件封装成sdk 5、如何使用cef3组件加载web页面 5.1、了解CefApp与CefClient 5.2、初始化与消息循环 5.3、如何创建浏览器 5.4、重载CefClient类 6、在qt客户端集成cef组件 7、最后…

VS2022上面运行QT程序

需求&#xff1a;之前是在QT6.6上面运行&#xff0c;现在想试一下VS2022&#xff1a; 操作步骤&#xff1a; 第一步&#xff1a; 在QT的配置软件中安装MSVC 第二步&#xff1a;配置VS 第三步&#xff1a;在VS上面安装QT插件&#xff0c;但是在QT上面安装速度很慢&#xff0c;…

Leetcode面试经典150题-15.三数之和

解法都在代码里&#xff0c;不懂就留言或者私信 class Solution {/**每次做这个题都想着这事最后一次了&#xff0c;但是确实很高频&#xff0c;还是多练练吧基本思路&#xff1a;先把原来的数组按照从小到大的顺序排列&#xff0c;然后我们从头开始确定第一个数&#xff0c;然…

STM32CubeMX stm32不限长度使用DMA收发串口数据

STM32CubeMX 配置 代码 stm32h7xx_it.c /*** brief This function handles UART7 global interrupt.*/ void UART7_IRQHandler(void) {/* USER CODE BEGIN UART7_IRQn 0 */if (UART7 huart7.Instance) // 判断是否是空闲中断{if (__HAL_UART_GET_FLAG(&huart7, UART_FLA…

数据导入导出(EasyExcel)框架入门指南

写在前面 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站 文章目录 EasyExcel 框架概述依赖APIExcel 实体类注解写 Excel概念介绍写 Excel 通用参数WriteWorkbookWriteSheetWriteTable 代码…

【Qt】常用控件QRadioButton

常用控件QRadioButton QRadioButton是单选按钮&#xff0c;可以在多个选项中选择一个。 作为QAbstractButton和QWidget的子类&#xff0c;其属性和用法&#xff0c;对于QRadioButton同样适用。 属性说明 checkable 是否能选中 checked 是否已经被选中. checkable 是 checked…

平安养老险宿州中支开展消防培训及逃生演练活动

近日&#xff0c;平安养老保险股份有限公司&#xff08;以下简称“平安养老险”&#xff09;宿州中心支公司邀请助安消防公司袁教官为公司员工开展消防安全知识培训。 培训教官结合近年来火灾典型案例&#xff0c;对火灾的危害、火灾的预防措施、灭火器材的使用进行深入浅出的…

centos 常用软件的安装和使用

redis 安装 0、下载、解压那些的我在这儿就不说了&#xff0c;有不懂的&#xff0c;看我之前写的博客。 1、在安装 redis 之前&#xff0c;我们得先安装它的依赖 yum install gcc-c 2、假设我下载放进的目录是 /usr/local/src/ &#xff0c; 并且 我的版本为 redis-6.0.8 …

数字化转型对金融服务业的影响

数字化转型正在塑造每个行业&#xff0c;从快速消费品到金融&#xff0c;每个行业都受到新兴技术的影响。 那么&#xff0c;数字化转型在金融服务中扮演什么角色&#xff1f;这对招聘前景有何影响&#xff1f; 我们探讨了数字化转型对该行业的影响、其对招聘策略的影响、数据…