目录
1.概述
QGridLayout类在网格中布局小部件。
QGridLayout获取可用空间(通过其父布局或parentWidget()),将其划分为行和列,并将其管理的每个小部件放入正确的单元格中。
每列都有一个最小宽度和一个拉伸系数。最小宽度是使用setColumnMinimumWidth()设置的。拉伸因子是使用setColumnStretch()设置的,它决定了该列将获得多少可用空间,以及超过其必要的最小值。
通常,使用addWidget()将每个托管小部件或布局放入自己的单元格中。小部件也可以使用addItem()和addWidget()的跨行和跨列重载来占用多个单元格。如果这样做,QGridLayout将猜测如何在列/行上分布大小(基于拉伸系数)。
要从布局中删除小部件,请调用removeWidget()。在小部件上调用QWidget::hide()也可以有效地从布局中删除小部件,直到调用QWidget::show()。
此图显示了一个带有五列三行网格的对话框片段(网格以洋红色重叠显示):
这个对话框片段中的第0、2和4列由QLabel、QLineEdit和QListBox组成。列1和3是由setColumnMinimumWidth()生成的占位符。第0行包含三个QLabel对象,第1行包含三个QLineEdit对象,第2行包含三个QListBox对象。我们使用占位符列(1和3)来获得列之间适当的空间。
请注意,列和行不是同样宽或同样高。如果希望两列具有相同的宽度,则必须将它们的最小宽度和拉伸因子设置为相同。可以使用setColumnMinimumWidth()和setColumnStretch()来实现。
如果QGridLayout不是顶级布局(即不管理所有小部件的区域和子部件),你必须在创建它时将它添加到其父布局中,但在你对它做任何事情之前。添加布局的通常方法是在父布局上调用addLayout()。一旦添加了布局,就可以开始使用addWidget()、addItem()和addLayout()将小部件和其他布局放入网格布局的单元格中。
QGridLayout还包括两个边距:内容边距和spacing()。内容边距是QGridLayout四个边中每个边的预留空间的宽度。spacing()是相邻框之间自动分配的间距的宽度。
默认的内容边距值由样式提供。Qt样式指定的默认值是子小部件9,窗口11。间距默认为与顶级布局的边距宽度相同,或与父布局相同。
2.图解表格布局中的常用术语和概念
2.1 表格布局有哪些属性
为了方便描述,此节均以Qt设计师的截图来说明,下图展示了Qt设计师提供的可编辑的属性。
2.2 Margin(边距)
2.3 Spacing(间隔)
2.4 Strech(纵向和横向拉伸系数)
2.5 最小行高与最小列宽
2.6 SizeConstraint(尺寸控制模式)
3.基础用法
3.1 使用Qt设计师创建布局
3.2 使用代码创建布局
GridLayoutTest.h
#pragma once
#include <QtWidgets/QMainWindow>
#include "ui_GridLayoutTest.h"
#include "QGridLayout"
class GridLayoutTest : public QMainWindow
{
Q_OBJECT
public:
GridLayoutTest(QWidget *parent = Q_NULLPTR);
private:
Ui::GridLayoutTestClass ui;
QGridLayout *m_pLayout;
};
GridLayoutTest.cpp
#include "GridLayoutTest.h"
#include "QPushButton"
GridLayoutTest::GridLayoutTest(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
m_pLayout = new QGridLayout;
ui.centralWidget->setLayout(m_pLayout);
QPushButton *btn1 = new QPushButton("btn1");
QPushButton *btn2 = new QPushButton("btn2");
QPushButton *btn3 = new QPushButton("btn3");
QPushButton *btn4 = new QPushButton("btn4");
QPushButton *btn5 = new QPushButton("btn5");
m_pLayout->addWidget(btn1);
m_pLayout->addWidget(btn2);
m_pLayout->addWidget(btn3);
m_pLayout->addWidget(btn4);
m_pLayout->addWidget(btn5);
}
3.3 在指定的行和列中添加控件
3.2节中的代码没有指定行和列,所以显示效果看起来不像是表格,反而像是垂直布局,下面来看一下如何指定行和列。
m_pLayout->addWidget(btn1,0,0);//添加到(第0行,第0列)
m_pLayout->addWidget(btn2,0,1);//添加到(第0行,第1列)
m_pLayout->addWidget(btn3,0,2);//添加到(第0行,第2列)
m_pLayout->addWidget(btn4,1,0);//添加到(第1行,第0列)
m_pLayout->addWidget(btn5,1,1);//添加到(第1行,第1列)
3.4 在表格布局内部再嵌套布局
QPushButton *btn1 = new QPushButton("btn1");
QPushButton *btn2 = new QPushButton("btn2");
QPushButton *btn3 = new QPushButton("btn3");
QPushButton *btn4 = new QPushButton("btn4");
QPushButton *btn5 = new QPushButton("btn5");
//在表格布局内部再嵌套布局
QTextEdit *pEdit = new QTextEdit;
QVBoxLayout *pVLayout = new QVBoxLayout;
pVLayout->addWidget(btn1);
pVLayout->addWidget(pEdit);
m_pLayout->addLayout(pVLayout,0,0);
m_pLayout->addWidget(btn2,0,1);//添加到(第0行,第1列)
m_pLayout->addWidget(btn3,0,2);//添加到(第0行,第2列)
m_pLayout->addWidget(btn4,1,0);//添加到(第1行,第0列)
m_pLayout->addWidget(btn5,1,1);//添加到(第1行,第1列)
可以看到在第一列第一行中,btn1和pEdit是垂直布局的。
3.5 设置常见属性
//设置最小列宽
void setColumnMinimumWidth(int column, int minSize)
//设置最小行高
void setRowMinimumHeight(int row, int minSize)
//设置每一列的列宽比例
void setColumnStretch(int column, int stretch)
//设置每一行的行高比例
void setRowStretch(int row, int stretch)
//设置水平方向各控件的间隔
void setHorizontalSpacing(int spacing)
//同时设置设置水平方向和垂直方向上各控件的间隔
void setSpacing(int spacing)
//设置垂直方向各控件的间隔
void setVerticalSpacing(int spacing)
3.6 设置尺寸控制模式
通过如下函数设置:
void setSizeConstraint(SizeConstraint)
其参数有如下可选值:
Constant | Value | Description |
QLayout::SetDefaultConstraint | 0 | 主小部件的最小尺寸被设置为minimumSize(),除非小部件已经有了最小尺寸。 |
QLayout::SetFixedSize | 3 | 主部件的尺寸被设置为sizeHint();它根本无法调整尺寸。 |
QLayout::SetMinimumSize | 2 | 主部件的最小尺寸设置为minimumSize();不能再小了。 |
QLayout::SetMaximumSize | 4 | 主部件的最大尺寸设置为maximumSize();不能再大了。 |
QLayout::SetMinAndMaxSize | 5 | 主小部件的最小尺寸设置为minimumSize(),最大尺寸设置为maximumSize()。 |
QLayout::SetNoConstraint | 1 | 小部件不受约束。 |
3.7 设置表格坐标原点
通过如下函数设置:
void setOriginCorner(Qt::Corner corner)
其参数有如下可选值:
Constant | Value | Description |
Qt::TopLeftCorner | 0x00000 | 以矩形的左上角为原点。 |
Qt::TopRightCorner | 0x00001 | 以矩形的右上角为原点。 |
Qt::BottomLeftCorner | 0x00002 | 以矩形的左下角为原点。 |
Qt::BottomRightCorner | 0x00003 | 以矩形的右下角为原点。 |