QT布局管理和空间提升为和空间间隔

news2024/7/6 20:05:12

QHBoxLayout:按照水平方向从左到右布局;

QVBoxLayout:按照竖直方向从上到下布局;

QGridLayout:在一个网格中进行布局,类似于HTML的table;

基本布局管理类包括:QBoxLayout、QGridLayout、QFormLayout 和 QStackedLayout。这些类都从QLayout继承而来,它们都来源于QObject(而不是 QWidget)。创建更加复杂的布局,可以让它们彼此嵌套完成。其中QBoxLayout提供了水平和垂直的布局管理;QFormLayout提供了将输入部件和标签成组排列的布局管理;QGridLayout提供了网格形式的布局管理QStackedLayout 提供了一组布局后的部件,可以对它们进行分布显示。

继承关系如下

一,QBoxLayout:继承QLayout

QBoxLayout类提供水平或垂直地排列子部件。QBoxLayout获取从它的父布局或从parentWidget()中所获得的空间,将其分成一列框,并使每个托管小部件填充一个框。

mainwindow.h 编程后的代码

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QPushButton>

class MainWindow : public QMainWindow
{
    Q_OBJECT

    public:
        MainWindow(QWidget *parent = nullptr);
        ~MainWindow();
 
    private:
      /* 声明按钮对象数组 */
         QPushButton *pushButton[6];
 
      /* 定义两个 widget,用于容纳排布按钮 */
         QWidget *hWidget;
         QWidget *vWidget;
    /* QHBoxLayout 与 QVBoxLayout 对象 */
         QHBoxLayout *hLayout;
         QVBoxLayout *vLayout;
};
#endif

mainwindow.cpp 编程后的代码

#include "mainwindow.h"
#include <QList>
 
MainWindow::MainWindow(QWidget *parent)
   : QMainWindow(parent)
 {
        /* 设置主窗口的位置与大小 */
         this->setGeometry(0, 0, 800, 480);
 
        /* 实例化与设置位置大小 */
         hWidget = new QWidget(this);
         hWidget->setGeometry(0, 0, 800, 240);
 
         vWidget = new QWidget(this);
         vWidget->setGeometry(0, 240, 800, 240);
 
         hLayout = new QHBoxLayout();
         vLayout = new QVBoxLayout();
 
      /*QList<T>是Qt的一种泛型容器类。它以链表方式存储一组值,并能对这组数据进行快速索引*/
         QList <QString>list;
         /* 将字符串值插入 list */
          list<<"one"<<"two"<<"three"<<"four"<<"five"<<"six";
 
          /* 用一个循环实例化 6 个按钮 */
         for(int i = 0; i < 6; i++)
         {
              pushButton[i] = new QPushButton();
              pushButton[i]->setText(list[i]);
              if(i < 3) 
              {
                    /* 将按钮添加至 hLayout 中 */
                     hLayout->addWidget(pushButton[i]);
               } 
               else
               {
                     /* 将按钮添加至 vLayout 中 */
                     vLayout->addWidget(pushButton[i]);
                }
         }
          /* 设置间隔为 50 */
           hLayout->setSpacing(50);
 
         /* hWidget 与 vWidget 的布局设置为 hLayout/vLayout */
         hWidget->setLayout(hLayout);
         vWidget->setLayout(vLayout);
  }
 
 MainWindow::~MainWindow()
 {
 }

二,QGridLayout:继承QLayout

QGridLayout获取可用的空间(通过其父布局或parentWidget())),将其分为行和列,并将其管理的每个小部件放入正确的单元格中。由于网格布局管理器中的组件也是会随着窗口拉伸而发生变化的,所以也是需要设置组件之间的比例系数的,与QBoxLayout不同的是网格布局管理器还需要分别设置行和列的比例系数。 

1,声明:
QWidget *gWidget;  //声明 widget 窗口部件,用于容纳下面 4 个 pushButton 按钮
QGridLayout *gridLayout;  // 声明 QGridLayout 对象
QPushButton *pushButton[4];  //声明 pushButton 按钮数组

2,使用:

 /* 设置位置与大小 */
 this->setGeometry(0, 0, 800, 480);
 
 /* 实例化 */
 gWidget = new QWidget(this);
 /* 设置 gWidget 居中央 */
 this->setCentralWidget(gWidget);
 
 gridLayout = new QGridLayout();
 /* QList 链表,字符串类型 */
 QList <QString> list;
 list<<"按钮 1"<<"按钮 2"<<"按钮 3"<<"按钮 4";
 for (int i = 0; i < 4; i++)
 {
      pushButton[i] = new QPushButton();
      pushButton[i]->setText(list[i]);
       /* 设置最小宽度与高度 */
      pushButton[i]->setMinimumSize(100, 30);
      /* 自动调整按钮的大小 */
      pushButton[i]->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);
       switch (i) 
       {
           case 0:
               /* 将 pushButton[0]添加至网格的坐标(0,0),下同 */
                 gridLayout->addWidget(pushButton[i], 0, 0);
                 break;
           case 1:
                 gridLayout->addWidget(pushButton[i], 0, 1);
                 break;
           case 2:
                 gridLayout->addWidget(pushButton[i], 1, 0);
                 break;
           case 3:
                 gridLayout->addWidget(pushButton[i], 1, 1);
                 break;
           default:
                  break;
        }
}
   /* 设置第 0 行与第 1 行的行比例系数 */
   gridLayout->setRowStretch(0, 2);
   gridLayout->setRowStretch(1, 3);
 
   /* 设置第 0 列与第 1 列的列比例系数 */
   gridLayout->setColumnStretch(0, 1);
   gridLayout->setColumnStretch(1, 3);
  
    /* 将 gridLayout 设置到 gWidget */
   gWidget->setLayout(gridLayout);

三,QFormLayout:继承QLayout 

QFormLayout类管理输入小部件及其关联标签的表单。QFormLayout是一个方便的布局类,它以两列的形式布局其子类。左列由标签组成,右列由“字段”小部件(QLineEdit(行编辑器)QSpinBox(旋转框等))组成。通常使用setRowWrapPolicy(RowWrapPolicy policy)接口函数设置布局的换行策略进行布局等。

1,声明:

QWidget *fWidget;   //widget 对象
QLineEdit *userLineEdit;  //用于输入用户名
QLineEdit *passwordLineEdit;  //用于输入密码
QFormLayout *formLayout;      //声明 QFormLayout 对象
2,使用

#include "mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
         /* 设置位置与大小 */
         this->setGeometry(0, 0, 800, 480);
 
         /* 实例化及设置位置与大小,下同 */
         fWidget = new QWidget(this);
         fWidget->setGeometry(250, 100, 300, 200);
 
         userLineEdit = new QLineEdit();
         passwordLineEdit = new QLineEdit();
 
         formLayout = new QFormLayout();
 
          /* 添加行 */
         formLayout->addRow("用户名:", userLineEdit);
         formLayout->addRow("密码 :", passwordLineEdit);
 
          /* 设置水平垂直间距 */
         formLayout->setSpacing(10);
 
          /* 设置布局外框的宽度 */
         formLayout->setMargin(20);
 
          /* 将 formLayout 布局到 fWidget */
         fWidget->setLayout(formLayout);
}

  

四,Spacers(空间间隔):继承QLayoutItem。Horizontal Spacer水平间隔和Vertical Spacer垂直间隔

QSpacerItem类在布局中提供空白(空间间隔)。所以QSpacerItem是在布局中使用的。它包含 Horizontal Spacer(水平间隔)与Vertical Spacer(垂直间隔)。

1,声明:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QPushButton>
#include <QSpacerItem>
#include <QBoxLayout>

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
private:
    /* 按钮对象数组 */
    QPushButton *bt[4];
    /* 垂直间隔 */
    QSpacerItem *vSpacer;
    /* 水平间隔 */
    QSpacerItem *hSpacer;
    /* 声明一个widget用来存放布局的内容 */
    QWidget *widget;
    /* 主布局对象 */
    QHBoxLayout *mainLayout;
    /* 垂直布局对象 */
    QVBoxLayout *vBoxLayout;
    /* 水平布局对象 */
    QHBoxLayout *hBoxLayout;
};
#endif // MAINWINDOW_H

2,使用

#include "mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    /* 设置主窗体显示位置与大小 */
    this->setGeometry(0, 0, 800, 480);

    widget = new QWidget(this);
    /* 居中widget */
    this->setCentralWidget(widget);

    /* 实例化对象 */
    vSpacer  =  new QSpacerItem(10, 10,
                                QSizePolicy::Minimum,
                                QSizePolicy::Expanding
                                );
    hSpacer  =  new QSpacerItem(10, 10,
                                QSizePolicy::Expanding,
                                QSizePolicy::Minimum
                                );

    vBoxLayout = new QVBoxLayout();
    hBoxLayout = new QHBoxLayout();
    mainLayout = new QHBoxLayout();

    /* 在vBoxLayout添加垂直间隔 */
    vBoxLayout->addSpacerItem(vSpacer);

    QList <QString>list;
    /* 将字符串值插入list */
    list<<"按钮1"<<"按钮2"<<"按钮3"<<"按钮4";
    /* 用一个循环实例化4个按钮 */
    for(int i = 0; i < 4 ; i++)
    {
        bt[i] = new QPushButton();
        bt[i]->setText(list[i]);
        if (i == 0)
        {
            /* 按钮1,设置为100*100 */
            bt[i]->setFixedSize(100, 100);
            /* 在vBoxLayout添加按钮1 */
            vBoxLayout->addWidget(bt[i]);
        } 
        else 
        {
            /* 按钮2~4,设置为60*60 */
            bt[i]->setFixedSize(60, 60);
            /* 在hBoxLayout添加按钮2~4 */
            hBoxLayout->addWidget(bt[i]);
        }
    }
    /* 在hBoxLayout添加水平间隔 */
    hBoxLayout->addSpacerItem(hSpacer);

    /* 在主布局里添加垂直布局 */
    mainLayout->addLayout(vBoxLayout);
    /* 在主布局里添加水平布局 */
    mainLayout->addLayout(hBoxLayout);

    /* 设置部件间距 */
    mainLayout->setSpacing(50);
    /* 将主布局设置为widget的布局 */
    widget->setLayout(mainLayout);
}
MainWindow::~MainWindow()
{
}

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

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

相关文章

AI人像写真解决方案,满足企业多样化视觉需求

美摄科技&#xff0c;作为一家专注于人工智能技术研发与应用的高新企业&#xff0c;深知企业对于高质量、高效率视觉内容的需求&#xff0c;特推出AI人像写真解决方案&#xff0c;为企业打开全新的视觉营销通道。 我们的AI人像写真解决方案&#xff0c;基于深度学习和计算机视…

3D分割项目 | 基于Pytorch+3DUnet实现的3D体积语义分割算法

项目应用场景 用于 3D 体积语义分割场景&#xff0c;适用于各种物体的 3D 语义分割&#xff0c;比如大米、大豆的体积分割等 项目效果&#xff1a; 项目流程 > 具体参见项目内README.md (1) 安装 conda install -c conda-forge mamba mamba create -n pytorch-3dunet -c p…

第十四届蓝桥杯JavaA组省赛真题 - 互质数的个数

解题思路&#xff1a; 快速幂 欧拉函数 快速幂比较常见于数据较大的取模场景&#xff0c;欧拉函数感觉还是有点抽象 注意&#xff1a; 取模的时候就不要简写了&#xff0c;例如&#xff1a;res res * a % mod;不要写成res * a % mod; import java.util.Scanner;public c…

cesium vue 绘制标记实体(撒点),监听鼠标左击事件

添加实体 const viewer new Cesium.Viewer(cesiumContainer, {})viewer.entities.add()查看实体 const viewer new Cesium.Viewer(cesiumContainer, {}) const billboard viewer.entities.add({...})viewer.zoomTo(billboard)删除实体 根据实体删除 if (billboard.value…

ElementUI 周组件展示成月的第几周

ElementUI 周组件展示成月的第几周 组件展示 <el-date-picker unlink-panels :clearable"false" change"weekChange":editable"false" :type"dateType":value-format"valueFormat" :format"format"v-if&qu…

怎样一次性给多篇word文档标注拼音?一键批量注音

随着办公自动化的普及&#xff0c;我们经常会遇到需要处理大量Word文档的情况。在这些文档中&#xff0c;有时需要将文字标注上拼音&#xff0c;特别是在处理一些包含生僻字或需要拼音辅助阅读的文档时。然而&#xff0c;手动一篇篇地给Word文档标注拼音不仅效率低下&#xff0…

深度剖析MySQL锁:解开数据库并发控制的神秘面纱

MySQL 锁是 MySQL 数据库管理系统中为了实现并发控制和数据一致性的机制。在多用户并发访问数据库时&#xff0c;锁可以确保多个事务在对同一数据进行操作时不会相互干扰&#xff0c;以防止数据不一致的现象发生。 一、锁分类 MySQL支持多种类型的锁&#xff0c;主要包括…

DataX-Oracle新增writeMode支持update

目录 前言 第一步下载源码 第二步修改源码 1、Oraclewriter 2、WriterUtil 2.1、修改getWriteTemplate方法 2.2、新增onMergeIntoDoString与getStrings方法 3、CommonRdbmsWriter 3.1、修改startWriteWithConnection 3.2、修改doBatchInsert 3.3、修改fillPreparedStatem…

苹果应用商店上架利器:推荐几款常用的应用发布工具

摘要 移动应用app上架是开发者关注的重要环节&#xff0c;但常常会面临审核不通过等问题。为帮助开发者顺利完成上架工作&#xff0c;各种辅助工具应运而生。本文探讨移动应用app上架原理、常见辅助工具功能及其作用&#xff0c;最终指出合理使用工具的重要性。 引言 移动应…

洛谷_P1803 凌乱的yyy / 线段覆盖_python写法

P1803 凌乱的yyy / 线段覆盖 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 这道题是不是用python做只能做到70分啊&#xff1f;&#xff1f; n int(input()) data [] for i in range(n):data.append(list(map(int,input().split())))data.sort(keylambda x:x[1])ans 1 mi…

Solidity Uniswap V2 Router swapTokensForExactTokens

最初的router合约实现了许多不同的交换方式。我们不会实现所有的方式&#xff0c;但我想向大家展示如何实现倒置交换&#xff1a;用未知量的输入Token交换精确量的输出代币。这是一个有趣的用例&#xff0c;可能并不常用&#xff0c;但仍有可能实现。 GitHub - XuHugo/solidit…

景联文科技高质量大模型训练数据汇总!

3月25日&#xff0c;2024年中国发展高层论坛年会上&#xff0c;国家数据局局长刘烈宏在“释放数据要素价值&#xff0c;助力可持续发展”的演讲中表示&#xff0c;中国10亿参数规模以上的大模型数量已超100个。 当前&#xff0c;国内AI大模型发展仍面临诸多困境。其中&#xff…

批量剪辑视频,批量调整片头片尾时长,批量剪辑更高效!

在视频剪辑的世界里&#xff0c;有时候我们需要对视频的片头片尾进行精细调整&#xff0c;以适应不同的需求和创意。然而&#xff0c;传统的视频剪辑软件往往操作繁琐&#xff0c;效率低下&#xff0c;让人望而却步。今天&#xff0c;我要为您介绍一种全新的批量剪辑方式&#…

一个传入省市区ID的级联框

省市区ID 功能edit页面(主要)script逻辑如何拿到当前级联下所有ID数组长ID数组是如何回显的 (1)长ID数组是如何回显的 (2) 功能 选择第一层传第一层下的所有 id 数组&#xff0c;选择第二层传递第二层以及第二层下的所有 id 数组 edit页面(主要) 编辑页的一个 Table&#xff0c…

Dynamo设置按链接视图显示

Hello大家好&#xff01;我是九哥~ 先来看一段视频&#xff1a; Dynamo设置链接视图 相信用Revit的小伙伴都用到过这个功能&#xff0c;就是在链接Revit模型时&#xff0c;为了便于出图&#xff0c;我们经常需要将链接模型从“按主体视图”改为“按链接视图”&#xff0c;这样能…

buy me a btc 使用数字货币进行打赏赞助

最近在调研使用加密货币打赏的平台&#xff0c;发现idatariver平台 https://idatariver.com 推出的buymeabtc功能刚好符合使用场景&#xff0c;下图为平台的演示项目, 演示项目入口 https://buymeabtc.com/idatariver 特点 不少人都听说过buymeacoffee&#xff0c;可以在上面发…

BabySQL【2019极客大挑战】

知识点&#xff1a; 功能分析 登录界面一般是 where username and password 可以从username出手&#xff0c;注释掉and语句单引号闭合绕过 通过测试和报错信息发现是一个单引号读取输入可以单引号闭合绕过关键字过滤 or and 过滤 || &&替换双写绕过select from wher…

【学习笔记】java项目—苍穹外卖day01

文章目录 苍穹外卖-day01课程内容1. 软件开发整体介绍1.1 软件开发流程1.2 角色分工1.3 软件环境 2. 苍穹外卖项目介绍2.1 项目介绍2.2 产品原型2.3 技术选型 3. 开发环境搭建3.1 前端环境搭建3.2 后端环境搭建3.2.1 熟悉项目结构3.2.2 Git版本控制3.2.3 数据库环境搭建3.2.4 前…

基于单片机环境监测温湿度PM2.5系统设计

**单片机设计介绍&#xff0c;基于单片机环境监测温湿度PM2.5系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机环境监测温湿度PM2.5系统是一个集成了传感器技术、单片机控制以及数据处理与显示功能的综合性系统…

30-3 越权漏洞 - 水平越权(横向越权)

环境准备:构建完善的安全渗透测试环境:推荐工具、资源和下载链接_渗透测试靶机下载-CSDN博客 一、定义 攻击者可以访问和操作与其拥有同级权限的用户资源。 示例: 学生A在教务系统上正常只能修改自己的作业内容,但由于不合理的权限校验规则等原因,学生A可以修改学生B的内…