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

Qt常用控件之网格布局QGridLayout

网格布局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.kler.cn/a/590180.html

相关文章:

  • 使用 GetX 实现状态管理:同一页面和不同页面之间的数据变化
  • 【Unity6打包Android】游戏启动的隐私政策弹窗(报错处理)
  • VSTO(C#)Excel开发12:多线程的诡异
  • 数据库核心技术面试题深度剖析:主从同步、二级索引与Change Buffer
  • 前端技巧第六期JavaScript对象
  • 【最新版】智慧小区物业管理小程序源码+uniapp全开源
  • 关于deepseek R1模型分布式推理效率分析
  • Java学习——数据库查询操作
  • 解决MySQL 8.x初始化后设置忽略表和字段大小写敏感的问题
  • 使用computed计算属性实现购物车勾选
  • Go vs Rust vs C++ vs Python vs Java:谁主后端沉浮
  • 【面试手撕】非常规算法,多线程常见手撕题目
  • Windows11 新机开荒(二)电脑优化设置
  • 企业向媒体发出邀约,有哪些注意点?
  • redis终章
  • 雷电模拟器连接Android Studio步骤
  • AI入门7:python三种API方式调用本地Ollama+DeepSeek
  • JDBC相关
  • EagleTrader为何重申重要数据前后2分钟禁止交易?
  • 【CXX】6.10 *mut T,*const T原始指针