在 Qt 中,布局管理器(Layout Manager) 是用于自动管理控件(如按钮、标签等)在窗口中排列位置和大小的重要机制。通过布局管理器,开发者无需手动计算控件的位置和尺寸,从而提高界面适配性与可维护性。


🔧 常见布局管理器类型

布局类型类名描述
水平布局QHBoxLayout控件从左到右排列
垂直布局QVBoxLayout控件从上到下排列
网格布局QGridLayout类似表格结构,可控制行列
表单布局QFormLayout通常用于输入表单,一列标签,一列输入框
栈式布局QStackedLayout多个页面重叠显示,仅显示一个(常用于多页面切换)

📦 使用流程(以 QVBoxLayout 为例)

#include <QApplication>
#include <QWidget>
#include <QPushButton>
#include <QVBoxLayout>

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    QWidget window;
    QVBoxLayout *layout = new QVBoxLayout();

    layout->addWidget(new QPushButton("按钮 1"));
    layout->addWidget(new QPushButton("按钮 2"));
    layout->addWidget(new QPushButton("按钮 3"));

    window.setLayout(layout);
    window.show();

    return app.exec();
}

🧩 布局嵌套(组合布局)

你可以将一个布局作为另一个布局的一部分,从而实现复杂布局结构:

QVBoxLayout *mainLayout = new QVBoxLayout;
QHBoxLayout *topLayout = new QHBoxLayout;
topLayout->addWidget(new QPushButton("左"));
topLayout->addWidget(new QPushButton("右"));

mainLayout->addLayout(topLayout);
mainLayout->addWidget(new QLabel("下方文本"));

window.setLayout(mainLayout);

⚙️ 控制控件伸缩性:addStretch() 与 setStretch()

layout->addStretch(); // 在按钮后添加可伸缩空间

layout->setStretch(0, 1); // 第0个控件伸缩因子为1
layout->setStretch(1, 2); // 第1个控件伸缩因子为2,空间更大

🪟 常用函数与属性

函数描述
addWidget(QWidget *)添加控件
addLayout(QLayout *)添加子布局
addSpacing(int px)添加固定空间
setMargin(int) 或 setContentsMargins()设置边距
setSpacing(int)控件间距
takeAt(int) / itemAt(int)访问或移除布局项

🧠 注意事项

  1. 设置布局后无需调用 setGeometry(),布局管理器会自动处理。
  2. 所有布局管理器和控件都是通过指针管理,别忘了设置父对象,避免内存泄漏。
  3. QMainWindow 不能直接用 setLayout(),而需用 setCentralWidget() 包装容器。

📚 参考资料

如需,我也可以提供你完整的 .cpp 文件示例或者添加 Qt Designer 的拖拽布局说明。需要吗?