一、布局管理器
1.1、布局管理器的作用
- 自动调整控件的位置,包括控件之间的间距、对齐等
- 当用户调整窗口大小时,位于布局管理器内的控件也会随之调整大小,从而保持整个界面的美观
1.2、布局管理器类继承结构图

二、使用布局管理器
2.1、QVBoxLayout(垂直布局)

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QWidget widget;
widget.setWindowTitle("QVBoxLayout");
widget.resize(500, 250);
QVBoxLayout *layout = new QVBoxLayout;
layout->setDirection(QBoxLayout::BottomToTop);
QLabel lab1("Label1");
lab1.setStyleSheet("QLabel{background:#dddddd;font:20px;}");
lab1.setAlignment(Qt::AlignCenter);
QLabel lab2("Label2");
lab2.setStyleSheet("QLabel{background:#cccccc;font:20px;}");
lab2.setAlignment(Qt::AlignCenter);
QLabel lab3("Label3");
lab3.setStyleSheet("QLabel{background:#ffffff;font:20px;}");
lab3.setAlignment(Qt::AlignCenter);
layout->addWidget(&lab3, 1);
layout->addWidget(&lab2, 1);
layout->addWidget(&lab1, 1);
widget.setLayout(layout);
widget.show();
return a.exec();
}
2.2、QHBoxLayout(水平布局)

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QWidget widget;
widget.setWindowTitle("QHBoxLayout");
widget.resize(500, 250);
QHBoxLayout *layout = new QHBoxLayout;
layout->setDirection(QBoxLayout::RightToLeft);
QLabel lab1("Label1");
lab1.setStyleSheet("QLabel{background:#dddddd;font:20px;}");
lab1.setAlignment(Qt::AlignCenter);
QLabel lab2("Label2");
lab2.setStyleSheet("QLabel{background:#cccccc;font:20px;}");
lab2.setAlignment(Qt::AlignCenter);
QLabel lab3("Label3");
lab3.setStyleSheet("QLabel{background:#ffffff;font:20px;}");
lab3.setAlignment(Qt::AlignCenter);
layout->addWidget(&lab3, 1);
layout->addWidget(&lab2, 1);
layout->addWidget(&lab1, 1);
widget.setLayout(layout);
widget.show();
return a.exec();
}
2.3、QGridLayout(网格布局)

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QWidget widget;
widget.setWindowTitle("QGridLayout");
widget.resize(500, 250);
QGridLayout *layout = new QGridLayout;
QLabel lab1("Label1");
lab1.setStyleSheet("QLabel{background:#dddddd;font:20px;}");
lab1.setAlignment(Qt::AlignCenter);
QLabel lab2("Label2");
lab2.setStyleSheet("QLabel{background:#cccccc;font:20px;}");
lab2.setAlignment(Qt::AlignCenter);
QLabel lab3("Label3");
lab3.setStyleSheet("QLabel{background:#ffffff;font:20px;}");
lab3.setAlignment(Qt::AlignCenter);
QLabel lab4("Label4");
lab4.setStyleSheet("QLabel{background:#aaaaaa;font:20px;}");
lab4.setAlignment(Qt::AlignCenter);
QLabel lab5("Label5");
lab5.setStyleSheet("QLabel{background:#bbbbbb;font:20px;}");
lab5.setAlignment(Qt::AlignCenter);
layout->addWidget(&lab1, 0, 0);
layout->addWidget(&lab2, 0, 1);
layout->addWidget(&lab3, 1, 0, 1, 2);
layout->addWidget(&lab4, 2, 0);
layout->addWidget(&lab5, 2, 1);
widget.setLayout(layout);
widget.show();
return a.exec();
}
2.4、QFormLayout(表单布局)

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QWidget widget;
widget.resize(500, 250);
widget.setWindowTitle("QFormLayout");
QFormLayout* layout = new QFormLayout();
layout->setRowWrapPolicy(QFormLayout::WrapAllRows);
layout->addRow("Name:", new QLineEdit());
layout->addRow("Email:", new QLineEdit());
layout->addRow("Adress:", new QLineEdit());
layout->setSpacing(10);
widget.setLayout(layout);
widget.show();
return a.exec();
}
2.5、QStackedLayout(分组局管理器)

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QWidget widget;
widget.setWindowTitle("QStackedLayout");
widget.resize(500, 250);
QListWidget *listWidget = new QListWidget(&widget);
listWidget->setMinimumWidth(150);
listWidget->setFont(QFont("宋体", 14));
listWidget->addItem("QPushButton");
listWidget->addItem("QLabel");
listWidget->addItem("QLineEdit");
QWidget widget1;
widget1.setMinimumSize(200, 200);
QPushButton but1("PushButton", &widget1);
QWidget widget2;
widget2.setMinimumSize(200, 200);
QLabel lab1("This is a Label", &widget2);
QWidget widget3;
widget3.setMinimumSize(200, 200);
QLineEdit edit("This is a QLineEdit", &widget3);
QStackedLayout *stackedLayout = new QStackedLayout;
stackedLayout->addWidget(&widget1);
stackedLayout->addWidget(&widget2);
stackedLayout->addWidget(&widget3);
QHBoxLayout *layout = new QHBoxLayout;
layout->addWidget(listWidget, 1);
layout->addLayout(stackedLayout, 4);
widget.setLayout(layout);
widget.show();
QObject::connect(listWidget, &QListWidget::currentRowChanged, stackedLayout, &QStackedLayout::setCurrentIndex);
return a.exec();
}