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

相关推荐
likerhood12 小时前
Java static 关键字从浅入深
java·开发语言
猫猫的小茶馆13 小时前
【Python】函数与模块化编程
linux·开发语言·arm开发·驱动开发·python·stm32
计算机安禾13 小时前
【c++面向对象编程】第38篇:设计原则(二):里氏替换、接口隔离与依赖倒置
开发语言·c++
_院长大人_13 小时前
Java Excel导出:如何实现自定义表头与字段顺序的完全控制
java·开发语言·后端·excel
我在人间贩卖青春13 小时前
重学Qt——事件处理
qt
code_whiter13 小时前
C++1进阶(继承)
开发语言·c++
来恩100313 小时前
JSTL的标签库种类
java·开发语言
Miss_min13 小时前
128K长序列数据生成
开发语言·python·深度学习
小宋00113 小时前
QT中控件qss样式修改
开发语言·qt
图像僧13 小时前
vs2019中的属性页使用说明
java·开发语言·jvm