一、QGridLayout介绍
QGridLayout是Qt框架中的一个布局管理器类,用于将子部件按照网格方式排列。它是QLayout类的子类,可在水平和垂直方向上自动调整和布局子部件的位置和大小。QGridLayout 将界面划分为若干“行”和“列”,你可以指定每个控件放在哪个位置(第几行、第几列),并可以设置控件跨越的行数和列数。它会自动管理控件的对齐、间距和缩放。
二、QGridLayout常用函数
将窗口控件添加到布局中,这个单元将从row和column开始,扩展到rowSpan和columnSpan指定的倍数的行和列。如果rowSpan或columnSpan的值为-1,则窗口部件将扩展到布局的底部或者右边边缘处,Qt::Alignment为对齐方式。
void QGridLayout::addWidget(QWidget *widget, int fromRow, int fromColumn, int rowSpan, int columnSpan, Qt::Alignment alignment = Qt::Alignment())
设置置行/列的伸缩空间
void QGridLayout::setRowStretch(int row, int stretch)
void QGridLayout::setColumnStretch(int column, int stretch)
可以用于同时设置水平、垂直间距,设置之后,水平、垂直间距相同。
void setSpacing(int spacing):setSpacing()
设置垂直间距
void setVerticalSpacing(int spacing)
设置水平间距
void setHorizontalSpacing(int spacing)
三、QGridLayout的用法
以下是QGridLayout的一些特点和用法:
1.格布局:QGridLayout将子部件按照网格形式排列,每个子部件占据一个单元格。可以根据需要指定行数和列数,以决定网格的大小和布局。
2.添加子部件:通过调用QGridLayout的addWidget()函数,可以向布局中添加子部件。可以指定子部件要放置在网格的哪一行和列上,并可以跨越多个行或列。
3.对齐方式:可以使用setAlignment()函数设置子部件在网格单元格内的对齐方式。可以指定水平和垂直方向上的对齐方式,如左对齐、右对齐、居中等。
4.弹性空间:QGridLayout支持弹性空间的概念。通过在网格中的行或列上添加弹性空间(setRowStretch()和setColumnStretch()),可以实现在布局中分配额外的空间或者平均分配剩余空间。
5.跨越多个单元格:可以使用setSpan()函数将子部件跨越多个网格单元格。这对于需要占据多个单元格的大型部件或自定义布局非常有用。
6.嵌套布局:QGridLayout可以与其他布局管理器一起使用,以实现更复杂的布局。可以将QGridLayout嵌套在其他布局管理器中,或者将其他布局管理器嵌套在QGridLayout中,以实现各种布局组合。
7.使用QGridLayout可以轻松创建灵活的网格布局,适用于多种类型的界面。它提供了方便和强大的方式来管理和调整子部件的位置和大小,并且支持灵活的行和列布局控制。
QGridLayout布局示例如下:
#include "main_window.h"
MainWindow::MainWindow(QWidget *parent)
: QWidget(parent)
{
m_pImageLabel = new QLabel(this);
m_pImageLabel->setFixedSize(90, 90);
m_pImageLabel->setScaledContents(true);
QPixmap pixmap("./images/logo.jpg");
m_pImageLabel->setPixmap(pixmap);
m_pUserEdit = new QLineEdit(this);
m_pUserEdit->setPlaceholderText("用户名");
m_pPasswordEdit = new QLineEdit(this);
m_pPasswordEdit->setPlaceholderText("密码");
m_pPasswordEdit->setEchoMode(QLineEdit::Password);
m_pRemberCheck = new QCheckBox(this);
m_pRemberCheck->setText("记住密码");
m_pAutoLoginCheck = new QCheckBox(this);
m_pAutoLoginCheck->setText("自动登陆");
m_pLoginButton = new QPushButton(this);
m_pLoginButton->setText("登陆");
m_pRegisterButton = new QPushButton(this);
m_pRegisterButton->setText("注册账号");
m_pForgotButton = new QPushButton(this);
m_pForgotButton->setText("找回密码");
QGridLayout *pLayout = new QGridLayout(this);
/* 图片在第0行,从第0行开始,占3行1列 */
pLayout->addWidget(m_pImageLabel, 0, 0, 3, 1);
/* 用户输入框第0行,从第1列开始,占1行2列 */
pLayout->addWidget(m_pUserEdit, 0, 1, 1, 2);
pLayout->addWidget(m_pRegisterButton, 0, 4);
/* 密码输入框第1行,从第1行开始,占1行2列 */
pLayout->addWidget(m_pPasswordEdit, 1, 1, 1, 2);
pLayout->addWidget(m_pForgotButton, 1, 4);
/* 记住密码 第2行,第1列开始,占1行1列 水平居左,垂直居中 */
pLayout->addWidget(m_pRemberCheck, 2, 1, 1, 1, Qt::AlignLeft | Qt::AlignVCenter);
/* 自动等罗 第2行,从第2列开始,占1行1列,水平居左,垂直居中 */
pLayout->addWidget(m_pAutoLoginCheck, 2, 2, 1, 1, Qt::AlignLeft | Qt::AlignVCenter);
/* 登陆按钮 第3行,第1列开始,占1行2列 */
pLayout->addWidget(m_pLoginButton, 3, 1, 1, 2);
/* 设置水平间距 */
pLayout->setHorizontalSpacing(10);
/* 设置垂直间距 */
pLayout->setVerticalSpacing(10);
/* 设置外间距 */
pLayout->setContentsMargins(10, 10, 10, 10);
this->setLayout(pLayout);
}