Qt常用控件之网格布局QGridLayout

news/2025/3/16 16:29:37/

网格布局QGridLayout

QGridLayout 是一个网格布局控件,它与 QVLayoutQHLayout 的不同在于,QGridLayout 能够允许自定义控件放入布局中所处的行和列。

1. QGridLayout属性

属性说明
layoutLeftMargin左侧边距。
layoutRightMargin右侧边距。
layoutTopMargin上方边距。
layoutBottomMargin下方边距。
layoutHorizontalSpacing相邻元素之间水平方向的间距。
layoutVerticalSpacing相邻元素之间垂直方向的间距。
layoutRowStretch行方向的拉伸系数。
layoutColumnStretch列方向的拉伸系数。

2. QGridLayout方法

方法说明
addWidget(QWidget*, int row,int colum)把控件添加到布局管理器。QGridLayout 添加控件时,还需要写上添加到的行和列,但这个行和列的值只是用于按大小排列顺序,并不是真的行和列。
setLayout设置布局管理器到……(即设置到 widget 中或其他 layout 中)
setColumnStretch(int colum,int index)设置同一行某列控件的不同拉伸系数,index 非零表示拉伸系数, 0 表示控件不参与拉伸。

3. 使用QGridLayout添加控件到布局

注意,addWidget()QGridLayout 中还要指定行和列,但这个行和列只是一个用于比较大小来决定控件先后顺序的值,故意设置一个很大的值和很小的值并不会使两个控件间隔很远。代码一定要 this->setLayout(Glayout); 或 set 到其他父控件,否则不会显示。

#include "widget.h"
#include "ui_widget.h"
#include <QLayout>
#include <QPushButton>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);QGridLayout* Glayout = new QGridLayout();QPushButton* button1 = new QPushButton("button1");QPushButton* button2 = new QPushButton("button2");QPushButton* button3 = new QPushButton("button3");QPushButton* button4 = new QPushButton("button4");//    //相当于垂直排布
//    Glayout->addWidget(button1,1,0);
//    Glayout->addWidget(button2,2,0);
//    Glayout->addWidget(button3,3,0);
//    Glayout->addWidget(button4,4,0);//    //相当于水平排布
//    Glayout->addWidget(button1,0,1);
//    Glayout->addWidget(button2,0,2);
//    Glayout->addWidget(button3,0,3);
//    Glayout->addWidget(button4,0,4);//对角线布局Glayout->addWidget(button1,1,1);Glayout->addWidget(button2,2,2);Glayout->addWidget(button3,3,3);Glayout->addWidget(button4,4,4);this->setLayout(Glayout);}Widget::~Widget()
{delete ui;
}

QGridLayout1

4. 调整QGridLayout中不同控件的拉伸比例

QGridLayout 有两个接口,setColumnStretch() 用于调整同一列的控件之间的左右拉伸比例, setRowStretch() 用于调整同一行控件的上下拉伸比例。但要注意,拉伸比例小于控件的 text 能显示的正常大小时,这个拉伸比例就不会起作用:

#include "widget.h"
#include "ui_widget.h"
#include <QLayout>
#include <QPushButton>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);QGridLayout* Glayout = new QGridLayout();QPushButton* button1 = new QPushButton("button1");QPushButton* button2 = new QPushButton("button2");QPushButton* button3 = new QPushButton("button3");QPushButton* button4 = new QPushButton("button4");//相当于水平排布Glayout->addWidget(button1,0,1);Glayout->addWidget(button2,0,2);Glayout->addWidget(button3,0,3);Glayout->addWidget(button4,0,4);Glayout->setColumnStretch(1,1);Glayout->setColumnStretch(2,2);Glayout->setColumnStretch(3,4);Glayout->setColumnStretch(4,8);this->setLayout(Glayout);
}Widget::~Widget()
{delete ui;
}

QGridLayout2

1 : 2 : 4 : 8 1:2:4:8 1:2:4:8 的比例排布。


在使用 setRowStretch() 前要注意,有些控件是受限于自身 sizePolicy 属性影响,是不会随着这个拉伸设置而改变布局的:

#include "widget.h"
#include "ui_widget.h"
#include <QLayout>
#include <QPushButton>
#include <QSizePolicy>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);QGridLayout* Glayout = new QGridLayout();QPushButton* button1 = new QPushButton("button1");QPushButton* button2 = new QPushButton("button2");QPushButton* button3 = new QPushButton("button3");QPushButton* button4 = new QPushButton("button4");//将按钮的水平和垂直方向都设置为任意拉伸button1->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);button2->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);button3->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);button4->setSizePolicy(QSizePolicy::Expanding,QSizePolicy::Expanding);Glayout->addWidget(button1,1,1);Glayout->addWidget(button2,1,2);Glayout->addWidget(button3,2,1);Glayout->addWidget(button4,2,2);Glayout->setRowStretch(1,1);Glayout->setRowStretch(2,2);this->setLayout(Glayout);
}Widget::~Widget()
{delete ui;
}

QGridLayout3


http://www.ppmy.cn/news/1579606.html

相关文章

【推荐项目】 043-停车管理系统

043-停车管理系统 介绍 使用 springboot vuejs mysql 技术搭建框架。 智能停车管理系统描述 后端框架&#xff1a;采用Spring Boot与MySQL的强强联合&#xff0c;为系统提供稳健、高效的服务支撑。 前端框架&#xff1a;前端选用Vue.js&#xff0c;打造流畅、美观的用户交…

Python 元组求生指南:不可变数据的终极奥义

对话实录 小白&#xff1a;&#xff08;抓狂&#xff09;我写了t (1,2,3)&#xff0c;为什么t[0] 10会报错&#xff1f; 专家&#xff1a;&#xff08;推眼镜&#xff09;元组是不可变对象&#xff01;想修改&#xff1f;只能新建元组&#xff01; 元组基础三连击 1. 创建…

Huggingface命令行下载开源大模型

Huggingface命令行下载模型 假设当前目录为 /root/lanyun-tmp 创建文件夹统一存放Huggingface下载的模型 mkdir Hugging-Face配置镜像源 vim ~/.bashrc填入以下两个&#xff0c;以修改HuggingFace 的镜像源 、模型保存的默认 export HF_ENDPOINThttps://hf-mirror.com export H…

深度学习-服务器训练SparseDrive过程记录

1、cuda安装 1.1 卸载安装失败的cuda 参考&#xff1a;https://blog.csdn.net/weixin_40826634/article/details/127493809 注意&#xff1a;因为/usr/local/cuda-xx.x/bin/下没有卸载脚本&#xff0c;很可能是apt安装的&#xff0c;所以通过执行下面的命令删除&#xff1a; a…

浙江大学:《DeepSeek智能时代的全面到来和人机协作的新常态》

大家好&#xff0c;我是吾鳴。 吾鳴之前给大家分享过浙江大学出品的DeepSeek的三份报告&#xff0c;它们分别是&#xff1a; 《DeepSeek行业应用案例集-解锁智能变革密码》 《DeepSeek模型解读》 《Chatting or Acting&#xff1f;DeepSeek的突破边界与浙大先生的未来图景》…

IXTUR气控永磁铁:以高精度气控和稳定磁场,为机器人应用提供稳定抓取力

在现代工业生产和物流领域&#xff0c;物料的抓取与搬运是影响生产效率和成本控制的重要环节。传统夹爪在面对不同材质、形状和重量的物体时&#xff0c;常常存在适应性差、抓取不稳定、操作复杂等问题&#xff0c;导致生产流程中频繁出现停机调整&#xff0c;增加了人工干预成…

机器人ROS学习:Ubuntu22.04安装ROS2和Moveit2实现运动规划

通过本篇文章学习&#xff0c;你可以收获以下内容&#xff1a; 学会在 Ubuntu22.04 上安装 Moveit2学会下载编译运行 Moveit2 样例程序学会使用样例程序进行运动规划等 版本平台 系统版本&#xff1a;ubuntu22.04ROS2 版本&#xff1a;humbleMoveit 版本&#xff1a;moveit2…

2025 linux系统资源使用率统计docker容器使用率统计docker监控软件Weave Scope安装weavescope

1.Weave Scope介绍 Weave Scope 是一款用于监控和可视化 Docker 容器、Kubernetes 集群以及分布式应用的强大工具。它的设计目标是帮助开发者和运维人员更好地理解和管理复杂的微服务架构。以下是 Weave Scope 的主要优点&#xff1a; 1. 实时可视化 Weave Scope 提供了一个直…