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。你更倾向于哪种交互方式?我可以针对那一种教你如何实现子界面给主界面"发消息"(信号与槽)。

相关推荐
不正经学生2 小时前
C语言预处理详解:编译器真正动手之前的那些事
c语言·开发语言·算法·面试·bug
门思科技2 小时前
LoRaWAN 设备类别:Class A、B、C 对比与选型指南
c语言·开发语言·php
恋恋西风4 小时前
C++ 理解 std::thread 在单核和多核上的行为差异
开发语言·c++
Brilliantwxx4 小时前
【Linux】 进程(9)程序与进程地址空间(基础+进阶+面试题)
linux·运维·服务器·开发语言·c++
BizzZ_5 小时前
C++(22)——类型转换和IO流
开发语言·c++
小范同学_5 小时前
JDK1.7 与 JDK1.8 HashMap 底层原理对比 + 数组并发扩容死循环详解
java·开发语言
geovindu6 小时前
CSharp: 万年历
开发语言·后端·c#·.net
我找到地球的支点啦6 小时前
Matlab系列(009) 一CRC循环冗余校验详解
开发语言·数据结构·算法·matlab·信息与通信
予昊6 小时前
从零实现“在线五子棋对战“:WebSocket 实时通信 + 段位匹配
java·开发语言·网络·websocket
weixin_461408587 小时前
Mybatis-flex小记
java·开发语言·mybatis