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

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()
{
}

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

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

相关文章

ubuntu编译OpenCV and seetaFace2

opencv opencv-4.5.2 opencv_contrib-4.5.2 SeetaFace2 SeetaFace2-master https://github.com/seetafaceengine 指定安装目录&#xff0c;和OpenCV放一个目录下了 安装前 安装 安装后 Qt安装 Windows下 Linux下 报错1 原因&#xff1a; 报错…

20221124 kafka实时数据写入Redis

一、上线结论 实现了将用户线上实时浏览的沉浸式视频信息&#xff0c;保存在Redis中这样一个功能。为实现沉浸式视频离线推荐到实时推荐提供了强有力的支持。目前只是应用在沉浸式场景&#xff0c;后续也能扩展到其他所有场景。用于两个场景&#xff1a;&#xff08;1&#xf…

【SQL】1661. 每台机器的进程平均运行时间 (四种写法;自连接;case when;窗口函数lead();)

前述 Sql窗口分析函数【lead、lag详解】 Hive 分析函数lead、lag实例应用 lag &#xff1a;用于统计窗口内往上第n行值lead &#xff1a;用于统计窗口内往下第n行值 lead(列名,1,0) over (partition by 分组列 order by 排序列 rows between 开始位置 preceding and 结束位置…

ChatGPT与传统搜索引擎的区别:智能对话与关键词匹配的差异

引言 随着互联网的快速发展&#xff0c;信息的获取变得比以往任何时候都更加便捷。在数字化时代&#xff0c;人们对于获取准确、及时信息的需求愈发迫切。传统搜索引擎通过关键词匹配的方式为用户提供了大量的信息&#xff0c;然而&#xff0c;这种机械式的检索方式有时候并不…

Mysql数据库-DQL查询

Mysql数据库-DQL基本查询 1 DQL基本查询1.1 基础查询1.2 WHERE子句1&#xff09;算术运算符2&#xff09;逻辑运算符3&#xff09;比较运算符A&#xff09;BETWEEN... AND ...B&#xff09;IN(列表)C&#xff09;NULL值判断 4&#xff09;综合练习 2 DQL高级查询2.1 LIKE 模糊查…

Triton推理服务器部署YOLOv8实战

课程链接&#xff1a;Triton推理服务器部署YOLOv8实战_在线视频教程-CSDN程序员研修院 Triton Inference Server&#xff08;Triton 推理服务器&#xff09;是一个高性能、灵活、可扩展的推理服务器&#xff0c;支持多种机器学习框架&#xff08;PyTorch、ONNX等&#xff09;和…

核验用户提供的身份证号和姓名是否一致的实名认证接口、C#调用

为什么要进行实名认证&#xff1f;互联网时代&#xff0c;网民在网上进行遨游的过程中&#xff0c;我们无法辨别其身份的真伪&#xff0c;网民财产安全没有保障&#xff0c;因此当平台用户在进行注册时&#xff0c;都会要求提供身份证信息使用实名认证接口来判断身份信息的真实…

无忧微服务:如何实现大流量下新版本的发布自由

作者&#xff1a;项良、十眠 微服务上云门槛降低&#xff0c;用好微服务才是关键 据调研数据显示&#xff0c;约 70% 的生产故障是由变更引起的。在阿里云上的企业应用如茶百道、极氪汽车和来电等&#xff0c;他们是如何解决变更引起的稳定性风险&#xff0c;实现了在白天高流…

牛客NC26 括号生成【中等 递归 Java,Go,PHP】

题目 题目链接&#xff1a; https://www.nowcoder.com/practice/c9addb265cdf4cdd92c092c655d164ca 思路 答案链接&#xff1a;https://www.lintcode.com/problem/427/solution/16924 参考答案Java import java.util.*;public class Solution {/*** 代码中的类名、方法名、参…

江协科技STM32:按键控制LED光敏传感器控制蜂鸣器

按键控制LED LED模块 左上角PA0用上拉输入模式&#xff0c;如果此时引脚悬空&#xff0c;PA0就是高电平&#xff0c;这种方式下&#xff0c;按下按键&#xff0c;引脚为低电平&#xff0c;松下按键&#xff0c;引脚为高电平 右上角PA0&#xff0c;把上拉电阻想象成弹簧 当按键…

【电路笔记】-交流电路波形的形状因子

波形的形状因子 文章目录 波形的形状因子1、概述2、正弦波波形因子3、波形因子示例14、波形因子示例25、单相半波整流波形6、单相全波整流波形7、三角波形形状因子8、锯齿波形因子9、方波和脉冲波形10、总结波形因子描述波形的形状或结构,是其均方根值与其平均值的比率。 1、概…

nacos的各种类型的配置文件 yml 、json、 Properties、 text 等文件类型 发生变化怎么热更新,实现实时监听nacos配置文件变化

本文用的是 Nacos作为配置中心注册监听器方法 实现热更新 nacos 配置文件 从而不用重启项目 依赖、工具类 这边就不写了 因为项目用的是 Json 类型的配置文件 所以下文 主要是对json文件进行实现 别的文件大同小异 先说扯淡的东西 在nacos 的配置文件中 dataId 这两种声明 是…

eclipse自动跳到console 解决办法

eclipse启动服务后&#xff0c;想看一些properties信息或者别的&#xff0c;但老是自动跳转到console页面&#xff0c;下面是解决办法&#xff1a; Eclipse中按照如下顺序找到设置菜单的位置&#xff1a; Window — Preferences — Run/Debug — Console 找到以下两项&#xf…

网络:udptcp套接字

目录 协议 网络传输基本流程 网络编程套接字 udp套接字编程 udp相关代码实现 sock函数 bind函数 recvfrom函数 sendto函数 udp执行指令代码 popen函数 udp多线程版收发消息 tcp套接字编程 tcp套接字代码 listen函数 accept函数 read/write函数 connect函数 recv/…

第二十一章 Jquery ajax

文章目录 1. jquery下载2. jquery的使用3. jquery页面加载完毕执行4. jquery属性控制6. 遍历器 2. ajax1. 准备后台服务器2. ajax发送get请求3. ajax发送post请求 1. jquery下载 点击下载 稳定版本1.9 2. jquery的使用 存放到html文件的同级目录 3. jquery页面加载完毕执行…

verilog设计-cdc:多比特信号跨时钟域(DMUX)

一、前言 多比特一般为数据&#xff0c;其在跨时钟域传输的过程中有多种处理方式&#xff0c;比如DMUX&#xff0c;异步FIFO&#xff0c;双口RAM&#xff0c;握手处理。本文介绍通过DMUX的方式传输多比特信号。 二、DMUX同步跨时钟域数据 dmux表示数据分配器&#xff0c;该方…

HarmonyOS 应用开发之UIAbility组件生命周期

概述 当用户打开、切换和返回到对应应用时&#xff0c;应用中的UIAbility实例会在其生命周期的不同状态之间转换。UIAbility类提供了一系列回调&#xff0c;通过这些回调可以知道当前UIAbility实例的某个状态发生改变&#xff0c;会经过UIAbility实例的创建和销毁&#xff0c;…

PCB损耗来源

信号经过PCB板会产生损耗&#xff0c;主要包括导体损耗&#xff0c;介电损耗和辐射损耗 导体损耗&#xff1a;导体损耗是由于电流流动过程中产生电阻损耗而发热。 介电损耗&#xff1a;介电损耗是由于电场通过介质时分子的交替极化和晶格碰撞造成的。 辐射损耗&#xff1a;辐…

React 应用实现监控可观测性最佳实践

前言 React 是一个用于构建用户界面的 JavaScript 框架。它采用了虚拟 DOM 和 JSX&#xff0c;提供了一种声明式的、组件化的编程模型&#xff0c;以便更高效地构建用户界面。无论是简单还是复杂的界面&#xff0c;React 都可以胜任。 YApi 是使用 React 编写的高效、易用、功…

报表生成器FastReport .Net用户指南:脚本示例

FastReport的报表生成器&#xff08;无论VCL平台还是.NET平台&#xff09;&#xff0c;跨平台的多语言脚本引擎FastScript&#xff0c;桌面OLAP FastCube&#xff0c;如今都被世界各地的开发者所认可&#xff0c;这些名字被等价于“速度”、“可靠”和“品质”,在美国&#xff…