1. 布局容器方式 (Layouts)
特点 :子界面像积木一样,一个接一个地排在主界面里。
验证场景 :每点一次按钮,主界面就多出一个子模块。

cpp
#include <QApplication>
#include <QWidget>
#include <QVBoxLayout>
#include <QPushButton>
#include <QLabel>
// 定义一个简单的子界面类
class SubWidget : public QWidget {
public:
SubWidget(int id, QWidget *parent = nullptr) : QWidget(parent) {
// 设置背景颜色以便区分
setStyleSheet("background-color: lightblue; border: 1px solid black;");
setMinimumHeight(50);
QVBoxLayout *layout = new QVBoxLayout(this);
layout->addWidget(new QLabel(QString("我是子界面编号: %1").arg(id)));
}
};
class MainWindow : public QWidget {
int counter = 0;
public:
MainWindow() {
QVBoxLayout *mainLayout = new QVBoxLayout(this);
QPushButton *btn = new QPushButton("添加子界面");
mainLayout->addWidget(btn);
// 创建一个专门放子界面的容器
QWidget *container = new QWidget();
QVBoxLayout *containerLayout = new QVBoxLayout(container);
mainLayout->addWidget(container);
// 点击按钮,new一个对象并加到布局里
connect(btn, &QPushButton::clicked, [=]() {
SubWidget *sub = new SubWidget(++counter);
containerLayout->addWidget(sub);
});
resize(300, 400);
}
};
int main(int argc, char *argv[]) {
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
2. 堆栈窗体方式 (QStackedWidget)
特点 :像 PPT 换页一样,主界面只有一个位置,点击按钮切换不同的子界面。
验证场景 :导航菜单切换。

cpp
#include <QApplication>
#include <QWidget>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QPushButton>
#include <QStackedWidget>
#include <QLabel>
class MainWindow : public QWidget {
public:
MainWindow() {
QHBoxLayout *mainLayout = new QHBoxLayout(this);
QVBoxLayout *btnLayout = new QVBoxLayout();
QStackedWidget *stack = new QStackedWidget();
// 创建两个不同的子界面类对象
QWidget *page1 = new QWidget();
page1->setStyleSheet("background-color: yellow;");
(new QVBoxLayout(page1))->addWidget(new QLabel("这是第一页"));
QWidget *page2 = new QWidget();
page2->setStyleSheet("background-color: cyan;");
(new QVBoxLayout(page2))->addWidget(new QLabel("这是第二页"));
stack->addWidget(page1);
stack->addWidget(page2);
QPushButton *btn1 = new QPushButton("切到第一页");
QPushButton *btn2 = new QPushButton("切到第二页");
btnLayout->addWidget(btn1);
btnLayout->addWidget(btn2);
mainLayout->addLayout(btnLayout);
mainLayout->addWidget(stack);
connect(btn1, &QPushButton::clicked, [=]() { stack->setCurrentIndex(0); });
connect(btn2, &QPushButton::clicked, [=]() { stack->setCurrentIndex(1); });
}
};
int main(int argc, char *argv[]) {
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
3. 多文档界面方式 (QMdiArea)
特点 :子界面是主界面内部的小窗口,可以最小化、重叠、拖动。
验证场景 :类似 Photoshop 或大型管理系统。

cpp
#include <QApplication>
#include <QMainWindow>
#include <QMdiArea>
#include <QMdiSubWindow>
#include <QPushButton>
#include <QTextEdit>
#include <QVBoxLayout>
class MainWindow : public QMainWindow {
int windowCount = 0;
public:
MainWindow() {
QMdiArea *mdiArea = new QMdiArea();
setCentralWidget(mdiArea); // 设置MDI区域为中心控件
QPushButton *btn = new QPushButton("新建窗口", this);
btn->move(10, 10); // 放在左上角
connect(btn, &QPushButton::clicked, [=]() {
// 创建子窗口内容
QTextEdit *edit = new QTextEdit();
edit->setWindowTitle(QString("文档 %1").arg(++windowCount));
// 将内容加入MDI区域,它会自动包装成一个带边框的子窗口
mdiArea->addSubWindow(edit);
edit->show();
});
resize(600, 400);
}
};
int main(int argc, char *argv[]) {
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
如何验证:
- Layouts 方式 :你会发现每点一次,列表就变长一次。这验证了你可以无限实例化对象。
- StackedWidget 方式 :验证了多个对象共存,但你可以控制谁"上台展示"。
- MDI 方式 :验证了子界面可以拥有独立的窗口属性(如标题栏、关闭按钮),但被限制在父窗口内部。
提示 :如果你是在 Qt Creator 里新建的项目,记得在 .pro 文件里确保有 QT += widgets。你更倾向于哪种交互方式?我可以针对那一种教你如何实现子界面给主界面"发消息"(信号与槽)。