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

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

相关文章:

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

QHBoxLayout&#xff1a;按照水平方向从左到右布局&#xff1b; QVBoxLayout&#xff1a;按照竖直方向从上到下布局&#xff1b; QGridLayout&#xff1a;在一个网格中进行布局&#xff0c;类似于HTML的table&#xff1b; 基本布局管理类包括&#xff1a;QBoxLayout、QGridL…...

Yolo 自制数据集dect训练改进

上一文请看 Yolo自制detect训练-CSDN博客 简介 如下图&#xff1a; 首先看一下每个图的含义 loss loss分为cls_loss, box_loss, obj_loss三部分。 cls_loss用于监督类别分类&#xff0c;计算锚框与对应的标定分类是否正确。 box_loss用于监督检测框的回归&#xff0c;预测框…...

vlan间单臂路由

【项目实践4】 --vlan间单臂路由 一、实验背景 实验的目的是在一个有限的网络环境中实现VLAN间的通信。网络环境包括两个交换机和一个路由器&#xff0c;交换机之间通过Trunk链路相连&#xff0c;路由器则连接到这两个交换机的Trunk端口上。 二、案例分析 在网络工程中&#…...

day4 linux上部署第一个nest项目(java转ts全栈/3R教室)

背景&#xff1a;上一篇吧nest-vben-admin项目&#xff0c;再开发环境上跑通了&#xff0c;并且build出来了dist文件&#xff0c;接下来再部署到linux试试吧 dist文件夹是干嘛的&#xff1f; 一个pnpn install 直接生成了两个dist文件夹&#xff0c;前端admin项目一个&#xf…...

学会这几点,是搭建产品知识库的关键

现如今&#xff0c;企业都特别看重产品知识库&#xff0c;因为有了它&#xff0c;企业就能更好地管理产品信息&#xff0c;提升客户服务水平&#xff0c;还能帮企业做决策。但是&#xff0c;搭建一个好用、高效的产品知识库&#xff0c;也难倒了不少人。下面&#xff0c;我们一…...

MySql 常用的聚合函数总结

MySQL 中的聚合函数用于对一组数据进行计算&#xff0c;并返回单个值作为结果。以下是常用的 MySQL 聚合函数的总结及其功能描述&#xff1a; 1. COUNT() 功能&#xff1a;用于计算指定列或表中的行数。 语法&#xff1a; COUNT(*) COUNT(expression) 示例&#xff1a; SELECT …...

Charles for Mac 强大的网络调试工具

Charles for Mac是一款功能强大的网络调试工具&#xff0c;可以帮助开发人员和测试人员更轻松地进行网络通信测试和调试。以下是一些Charles for Mac的主要特点&#xff1a; 软件下载&#xff1a;Charles for Mac 4.6.6注册激活版 流量截获&#xff1a;Charles可以截获和分析通…...

【数据结构】优先级队列——堆

&#x1f9e7;&#x1f9e7;&#x1f9e7;&#x1f9e7;&#x1f9e7;个人主页&#x1f388;&#x1f388;&#x1f388;&#x1f388;&#x1f388; &#x1f9e7;&#x1f9e7;&#x1f9e7;&#x1f9e7;&#x1f9e7;数据结构专栏&#x1f388;&#x1f388;&#x1f388;&…...

【力扣】45.跳跃游戏Ⅱ

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

containerd使用了解

containerd使用了解 yum安装 [rootvm ~]# curl -o /etc/yum.repos.d/docker.repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo [rootvm ~]# yum list | grep containerd containerd.io.x86_64 1.6.28-3.1.el7 doc…...

gateway 分发时若两个服务的路由地址一样,怎么指定访问想要的服务下的地址

1.思路 在使用Spring Cloud Gateway时&#xff0c;如果两个服务的路由地址相同&#xff0c;可以通过Predicate&#xff08;断言&#xff09;和Filter&#xff08;过滤器&#xff09;的组合来实现根据请求的不同条件将请求分发到不同的服务下的地址。 使用Predicate进行路由条件…...

【LeetCode】三月题解

文章目录 [2369. 检查数组是否存在有效划分](https://leetcode.cn/problems/check-if-there-is-a-valid-partition-for-the-array/)思路&#xff1a;代码&#xff1a; [1976. 到达目的地的方案数](https://leetcode.cn/problems/number-of-ways-to-arrive-at-destination/) 思路…...

云手机:实现便携与安全的双赢

随着5G时代的到来&#xff0c;云手机在各大游戏、直播和新媒体营销中扮演越来越重要的角色。它不仅节约了成本&#xff0c;提高了效率&#xff0c;而且在边缘计算和云技术逐渐成熟的背景下&#xff0c;展现出了更大的发展机遇。 云手机的便携性如何&#xff1f; 云手机的便携性…...

fast_bev学习笔记

目录 一. 简述二. 输入输出三. github资源四. 复现推理过程4.1 cuda tensorrt 版 一. 简述 原文:Fast-BEV: A Fast and Strong Bird’s-Eye View Perception Baseline FAST BEV是一种高性能、快速推理和部署友好的解决方案&#xff0c;专为自动驾驶车载芯片设计。该框架主要包…...

Collection与数据结构链表与LinkedList(三):链表精选OJ例题(下)

1. 分割链表 OJ链接 class Solution {public ListNode partition(ListNode head, int x) {if(head null){return null;//空链表的情况}ListNode cur head;ListNode formerhead null;ListNode formerend null;ListNode latterhead null;ListNode latterend null;//定义…...

05 | Swoole 源码分析之 WebSocket 模块

首发原文链接&#xff1a;Swoole 源码分析之 WebSocket 模块 大家好&#xff0c;我是码农先森。 引言 WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议。它允许客户端和服务器之间进行实时数据传输。 与传统的 HTTP 请求-响应模型不同&#xff0c;WebSocket 可以保持…...

Vue--------父子/兄弟组件传值

父子组件 子组件通过 props 属性来接受父组件的数据&#xff0c;然后父组件在子组件上注册监听事件&#xff0c;子组件通过 emit 触发事件来向父组件发送数据。 defineProps接收 let props defineProps({data: Array, }); defineModel接收 let bb defineModel("sit…...

Qt实现Kermit协议(一)

1 概述 Kermit文件运输协议提供了一条从大型计算机下载文件到微机的途径。它已被用于进行公用数据传输。 其特性如下: Kermit文件运输协议是一个半双工的通信协议。它支持7位ASCII字符。数据以可多达96字节长度的可变长度的分组形式传输。对每个被传送分组需要一个确认。Kerm…...

linux在使用重定向写入文件时(使用标准C库函数时)使处理信号异常(延时)--问题分析

linux在使用重定向写入文件时(使用标准C库函数时)使处理信号异常(延时)–问题分析 在使用alarm函数进行序号处理测试的时候发现如果把输出重定向到文件里面会导致信号的处理出现严重的延迟(ubuntu18) #include <stdio.h> #include <stdlib.h> #include <unist…...

淘宝扭蛋机小程序:趣味购物新体验,惊喜连连等你来

在数字化时代&#xff0c;淘宝始终站在创新的前沿&#xff0c;不断探索和引领电商行业的发展趋势。今天&#xff0c;我们欣然宣布&#xff0c;经过精心研发和打磨&#xff0c;淘宝扭蛋机小程序正式上线&#xff0c;为用户带来一场充满趣味与惊喜的购物新体验。 淘宝扭蛋机小程…...

【Go】3、Go语言进阶与依赖管理

前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课&#xff0c;做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程&#xff0c;它的核心机制是 Goroutine 协程、Channel 通道&#xff0c;并基于CSP&#xff08;Communicating Sequential Processes&#xff0…...

C++ 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

JUC笔记(上)-复习 涉及死锁 volatile synchronized CAS 原子操作

一、上下文切换 即使单核CPU也可以进行多线程执行代码&#xff0c;CPU会给每个线程分配CPU时间片来实现这个机制。时间片非常短&#xff0c;所以CPU会不断地切换线程执行&#xff0c;从而让我们感觉多个线程是同时执行的。时间片一般是十几毫秒(ms)。通过时间片分配算法执行。…...

vue3+vite项目中使用.env文件环境变量方法

vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量&#xff0c;这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)

目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关&#xff0…...

MySQL账号权限管理指南:安全创建账户与精细授权技巧

在MySQL数据库管理中&#xff0c;合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号&#xff1f; 最小权限原则&#xf…...

JAVA后端开发——多租户

数据隔离是多租户系统中的核心概念&#xff0c;确保一个租户&#xff08;在这个系统中可能是一个公司或一个独立的客户&#xff09;的数据对其他租户是不可见的。在 RuoYi 框架&#xff08;您当前项目所使用的基础框架&#xff09;中&#xff0c;这通常是通过在数据表中增加一个…...

虚拟电厂发展三大趋势:市场化、技术主导、车网互联

市场化&#xff1a;从政策驱动到多元盈利 政策全面赋能 2025年4月&#xff0c;国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》&#xff0c;首次明确虚拟电厂为“独立市场主体”&#xff0c;提出硬性目标&#xff1a;2027年全国调节能力≥2000万千瓦&#xff0…...

Python 实现 Web 静态服务器(HTTP 协议)

目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1&#xff09;下载安装包2&#xff09;配置环境变量3&#xff09;安装镜像4&#xff09;node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1&#xff09;使用 http-server2&#xff09;详解 …...

GeoServer发布PostgreSQL图层后WFS查询无主键字段

在使用 GeoServer&#xff08;版本 2.22.2&#xff09; 发布 PostgreSQL&#xff08;PostGIS&#xff09;中的表为地图服务时&#xff0c;常常会遇到一个小问题&#xff1a; WFS 查询中&#xff0c;主键字段&#xff08;如 id&#xff09;莫名其妙地消失了&#xff01; 即使你在…...