Qt-界面子类(1)

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();
}

如何验证:

  1. Layouts 方式 :你会发现每点一次,列表就变长一次。这验证了你可以无限实例化对象
  2. StackedWidget 方式 :验证了多个对象共存,但你可以控制谁"上台展示"。
  3. MDI 方式 :验证了子界面可以拥有独立的窗口属性(如标题栏、关闭按钮),但被限制在父窗口内部。

提示 :如果你是在 Qt Creator 里新建的项目,记得在 .pro 文件里确保有 QT += widgets。你更倾向于哪种交互方式?我可以针对那一种教你如何实现子界面给主界面"发消息"(信号与槽)。

相关推荐
Sylvia33.4 小时前
体育数据API实战:用火星数据实现NBA赛事实时比分与状态同步
java·linux·开发语言·前端·python
遗憾随她而去.4 小时前
js 插件 Clipboard.js 与原生 Clipboard API 全方位对比
开发语言·前端·javascript
人道领域4 小时前
Day | 07 【苍穹外卖 :用户端添加购物车】
java·开发语言·数据库·后端·苍穹外卖
@我漫长的孤独流浪4 小时前
Python爬虫实战:从入门到精通
开发语言·爬虫·python
weixin_456321644 小时前
Java架构设计:Redis RDB持久化深度解析(原理+实战+避坑)
java·开发语言·redis
C羊驼4 小时前
C 语言:哥德巴赫猜想
c语言·开发语言·人工智能·经验分享·笔记·算法·课程设计
NGC_66114 小时前
CMS收集器详解
java·开发语言·jvm
旺仔.2914 小时前
死锁 详解
linux·开发语言·计算机网络·安全
I love studying!!!4 小时前
python项目: 下载数据
开发语言·python