Qt常用控件之网格布局QGridLayout
网格布局QGridLayout
QGridLayout
是一个网格布局控件,它与 QVLayout
和 QHLayout
的不同在于,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;
}
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;
}
按 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;
}