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

相关推荐
C++ 老炮儿的技术栈2 小时前
不调用C++/C的字符串库函数,编写函数strcmp
c语言·开发语言·c++·人工智能·windows·git·visual studio
幸福的达哥2 小时前
Python多线程、多进程、协程、锁、同步、异步的详解和应用
开发语言·python
Hgfdsaqwr2 小时前
内存泄漏检测与防范
开发语言·c++·算法
熬夜敲代码的小N2 小时前
Python基础入门:环境配置全指南+核心语法解析
开发语言·python
嫂子开门我是_我哥2 小时前
第十八节:项目实战2:简易通讯录(面向对象+文件持久化实现)
开发语言·python
MediaTea2 小时前
Python:_sentinel 命名约定
开发语言·python·sentinel
茉莉玫瑰花茶2 小时前
C++17 详细特性解析(中)
开发语言·c++
shehuiyuelaiyuehao2 小时前
String的杂七杂八方法
java·开发语言
机器视觉知识推荐、就业指导3 小时前
Qt 元对象系统:机制、组成与典型用法
数据库·qt