QGridLayout 类在网格中布置小部件。
QGridLayout 获取可用的空间(通过其父布局或 parentWidget()),将其划分为行和列,并将其管理的每个小部件放入正确的单元格中。
列和行的行为相同;我们将讨论列,但行也有等价的函数。
每列都有一个最小宽度和一个拉伸因子。最小宽度是使用 setColumnMinimumWidth() 设置的最大宽度和该列中每个小部件的最小宽度。拉伸因子使用 setColumnStretch() 设置,并确定列将获得多少可用空间超过其必要的最小值。
通常,使用 addWidget() 将每个托管小部件或布局放入其自己的单元格中。小部件也可以使用 addItem() 和 addWidget() 的行和列跨越重载来占据多个单元格。如果这样做, QGridLayout 将猜测如何在列/行上分配大小(基于拉伸因子)。
要从布局中删除小部件,请调用 removeWidget()。在小部件上调用 QWidget::hide() 也会有效地从布局中删除小部件,直到调用 QWidget::show()。
源码:
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QGridLayout>
#include <QString>
#include <QPushButton>
#include <QLabel>
#include <QDebug>
#include <QLineEdit>
#include <QCheckBox>
class Widget : public QWidget
{
Q_OBJECT
QPushButton m_btn1;
QPushButton m_btn2;
protected slots:
void OnClicked1();
void OnClicked2();
public:
QString FetchString(const char* s);
Widget(QWidget *parent = nullptr);
~Widget();
};
#endif // WIDGET_H
#include "Widget.h"
#include <QVBoxLayout>
#include <QGridLayout>
#include <QMessageBox>
#include <QPixmap>
Widget::Widget(QWidget *parent) : QWidget(parent, Qt::WindowFlags()|Qt::WindowCloseButtonHint)
{
m_btn1.setText(FetchString("方法:"));
m_btn2.setText(FetchString("项目"));
QVBoxLayout* vLayout = new QVBoxLayout();
vLayout->addWidget(&m_btn1);
vLayout->addWidget(&m_btn2);
connect(&m_btn1, SIGNAL(clicked()), this, SLOT(OnClicked1()));
connect(&m_btn2, SIGNAL(clicked()), this, SLOT(OnClicked2()));
setLayout(vLayout);
setFixedSize(320, 80);
}
void Widget::OnClicked1()
{
QDialog dia(this);
QGridLayout* gLayout = new QGridLayout();
QPushButton* pButton1 = new QPushButton(FetchString("One"));
QPushButton* pButton2 = new QPushButton(FetchString("Two"));
QPushButton* pButton3 = new QPushButton(FetchString("Three"));
QPushButton* pButton4 = new QPushButton(FetchString("Four"));
QPushButton* pButton5 = new QPushButton(FetchString("Five"));
QPushButton* pButton6 = new QPushButton(FetchString("Six1"));
QPushButton* pButton7 = new QPushButton(FetchString("Seven"));
pButton1->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
pButton2->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
pButton3->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
pButton4->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
pButton5->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
pButton6->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
pButton7->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
gLayout->addWidget(pButton1, 0, 1);
gLayout->addWidget(pButton2, 1, 0, 2, 1);
gLayout->addWidget(pButton3, 1, 1);
gLayout->addWidget(pButton4, 1, 2);
gLayout->addWidget(pButton5, 2, 1);
gLayout->addWidget(pButton6, 3, 0, 1, 3);
gLayout->addWidget(pButton7, 4, 1);
gLayout->setColumnStretch(0, 1);
gLayout->setColumnStretch(1, 1);
gLayout->setColumnStretch(2, 2);
gLayout->setRowStretch(0, 1);
gLayout->setRowStretch(1, 2);
gLayout->setRowStretch(2, 2);
gLayout->setRowStretch(3, 2);
gLayout->setRowStretch(4, 2);
dia.setLayout(gLayout);
dia.exec();
}
void Widget::OnClicked2()
{
QDialog dia(this);
QGridLayout* gLayout = new QGridLayout();
QLineEdit* Useredit = new QLineEdit();
QLineEdit* PassWdedit = new QLineEdit();
QCheckBox* check1 = new QCheckBox(FetchString("记住密码"));
QCheckBox* check2 = new QCheckBox(FetchString("自动登录"));
QPushButton* pBtn = new QPushButton(FetchString("登录"));
QPushButton* btn1 = new QPushButton(FetchString("申请账号"));
QPushButton* btn2 = new QPushButton(FetchString("找回密码"));
QPixmap pix("D:/Project/Sample/Sample007/Label.ico");
QLabel* label = new QLabel(FetchString("测试"));
label->setPixmap(pix);
label->setScaledContents(true);
Useredit->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
Useredit->setPlaceholderText(FetchString("账号:"));
PassWdedit->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
PassWdedit->setPlaceholderText(FetchString("密码:"));
btn1->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
btn1->setStyleSheet("border:none");
btn1->setFlat(true);
btn2->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
btn2->setStyleSheet("border:none");
btn2->setFlat(true);
gLayout->addWidget(label, 0, 0, 3, 1);
gLayout->addWidget(Useredit, 0, 1, 1, 3);
gLayout->addWidget(PassWdedit, 1, 1, 1, 3);
gLayout->addWidget(btn1, 0, 5);
gLayout->addWidget(btn2, 1, 5);
gLayout->addWidget(check1, 2, 1);
gLayout->addWidget(check2, 2, 3);
gLayout->addWidget(pBtn, 3, 1, 1, 3);
dia.setLayout(gLayout);
dia.setFixedSize(300, 130);
dia.exec();
}
QString Widget::FetchString(const char* s)
{
return QString::fromLocal8Bit(s);
}
Widget::~Widget()
{
}
运行效果如下: