当前位置: 首页 > ds >正文

QStackedLayout、QStackedWidget 二者的区别?

QStackedLayoutQStackedWidget 都是 Qt 中用于管理多个页面(或窗口部件)的类,但它们在使用方式和功能上有一些区别。以下是它们的主要区别:

1. 使用方式

  • QStackedLayout

    • 是一个布局管理器,用于在同一个位置显示多个窗口部件。
    • 通常用于动态管理一组窗口部件,这些窗口部件可以是任意类型的 QWidget
    • 通过 QStackedLayout,你可以将多个窗口部件堆叠在一起,并通过索引切换显示的窗口部件。
  • QStackedWidget

    • 是一个容器控件,用于在同一个位置显示多个页面。
    • 每个页面是一个 QWidget,但 QStackedWidget 提供了更高级的接口来管理这些页面。
    • 通常用于创建多页的用户界面,例如选项卡或向导。

2. 功能

  • QStackedLayout

    • 提供了基本的堆叠布局功能。
    • 通过 setCurrentIndex(int index)setCurrentWidget(QWidget *widget) 方法切换显示的窗口部件。
    • 适用于需要动态管理多个窗口部件的场景。
  • QStackedWidget

    • 提供了更高级的功能,例如:
      • addWidget(QWidget *widget):添加一个页面。
      • removeWidget(QWidget *widget):移除一个页面。
      • setCurrentIndex(int index)setCurrentWidget(QWidget *widget):切换显示的页面。
      • count():获取页面的数量。
      • widget(int index):获取指定索引的页面。
    • 适用于需要管理多个页面的场景,例如选项卡或向导。

3. 示例代码

使用 QStackedLayout 的示例
#include <QApplication>
#include <QMainWindow>
#include <QPushButton>
#include <QLabel>
#include <QVBoxLayout>
#include <QStackedLayout>class MainWindow : public QMainWindow {Q_OBJECT
public:MainWindow(QWidget *parent = nullptr) : QMainWindow(parent) {QWidget *centralWidget = new QWidget(this);setCentralWidget(centralWidget);QStackedLayout *stackedLayout = new QStackedLayout(centralWidget);QWidget *page1 = new QWidget(this);QVBoxLayout *layout1 = new QVBoxLayout(page1);QLabel *label1 = new QLabel("This is Page 1", page1);layout1->addWidget(label1);page1->setLayout(layout1);QWidget *page2 = new QWidget(this);QVBoxLayout *layout2 = new QVBoxLayout(page2);QLabel *label2 = new QLabel("This is Page 2", page2);layout2->addWidget(label2);page2->setLayout(layout2);stackedLayout->addWidget(page1);stackedLayout->addWidget(page2);QPushButton *button1 = new QPushButton("Show Page 1", this);QPushButton *button2 = new QPushButton("Show Page 2", this);QVBoxLayout *mainLayout = new QVBoxLayout(centralWidget);mainLayout->addLayout(stackedLayout);mainLayout->addWidget(button1);mainLayout->addWidget(button2);connect(button1, &QPushButton::clicked, this, [this]() {stackedLayout->setCurrentIndex(0);});connect(button2, &QPushButton::clicked, this, [this]() {stackedLayout->setCurrentIndex(1);});}
};int main(int argc, char *argv[]) {QApplication a(argc, argv);MainWindow w;w.show();return a.exec();
}
使用 QStackedWidget 的示例
#include <QApplication>
#include <QMainWindow>
#include <QPushButton>
#include <QLabel>
#include <QVBoxLayout>
#include <QStackedWidget>class MainWindow : public QMainWindow {Q_OBJECT
public:MainWindow(QWidget *parent = nullptr) : QMainWindow(parent) {QWidget *centralWidget = new QWidget(this);setCentralWidget(centralWidget);QStackedWidget *stackedWidget = new QStackedWidget(centralWidget);QWidget *page1 = new QWidget(this);QVBoxLayout *layout1 = new QVBoxLayout(page1);QLabel *label1 = new QLabel("This is Page 1", page1);layout1->addWidget(label1);page1->setLayout(layout1);QWidget *page2 = new QWidget(this);QVBoxLayout *layout2 = new QVBoxLayout(page2);QLabel *label2 = new QLabel("This is Page 2", page2);layout2->addWidget(label2);page2->setLayout(layout2);stackedWidget->addWidget(page1);stackedWidget->addWidget(page2);QPushButton *button1 = new QPushButton("Show Page 1", this);QPushButton *button2 = new QPushButton("Show Page 2", this);QVBoxLayout *mainLayout = new QVBoxLayout(centralWidget);mainLayout->addWidget(stackedWidget);mainLayout->addWidget(button1);mainLayout->addWidget(button2);connect(button1, &QPushButton::clicked, this, [this]() {stackedWidget->setCurrentIndex(0);});connect(button2, &QPushButton::clicked, this, [this]() {stackedWidget->setCurrentIndex(1);});}
};int main(int argc, char *argv[]) {QApplication a(argc, argv);MainWindow w;w.show();return a.exec();
}

4. 总结

  • QStackedLayout

    • 适用于需要动态管理多个窗口部件的场景。
    • 提供了基本的堆叠布局功能。
    • 更灵活,可以嵌入到其他布局中。
  • QStackedWidget

    • 适用于需要管理多个页面的场景,例如选项卡或向导。
    • 提供了更高级的接口来管理页面。
    • 更方便,提供了更多的功能和方法。

根据你的具体需求选择合适的类。如果你需要更高级的页面管理功能,建议使用 QStackedWidget。如果你需要更灵活的布局管理,可以使用 QStackedLayout

http://www.xdnf.cn/news/4848.html

相关文章:

  • 桥隧坡灾害监测报警:用科技筑起生命安全的“智能防线”
  • C++23 views::as_rvalue (P2446R2) 深入解析
  • Hutool中的Pair类详解
  • Simufact Welding重塑新能源汽车电池盒焊接工艺
  • C程序题案例分析
  • Nacos源码—6.Nacos升级gRPC分析一
  • 缓存(1):三级缓存
  • 企业如何借助国外动态IP抢占海外市场先机?
  • uniapp 微信小程序使用图表
  • 人工智能在网络安全中的重要性
  • kotlin JvmName注解的作用和用途
  • 【WebRTC-13】是在哪,什么时候,创建编解码器?
  • 驱动开发硬核特训 · Day 30(下篇): 深入解析 lm48100q I2C 音频编解码器驱动模型(基于 i.MX8MP)
  • 【MCP】为什么使用Streamable HTTP: 相比SSE的优势与实践指南
  • 初识Dockerfile之RUN和WORKDIR
  • 【MySQL】第二弹——MySQL表的增删改查(CURD))
  • [ctfshow web入门] web57
  • 2025 后端自学UNIAPP【项目实战:旅游项目】3、API接口请求封装,封装后的简单测试以及实际使用
  • springCloud/Alibaba常用中间件之GateWay网关
  • 大型语言模型在网络安全领域的应用综述
  • 【WEB3】区块链、隐私计算、AI和Web3.0——数据民主化(1)
  • Python爬虫(21)Python爬虫进阶:Selenium自动化处理动态页面实战解析
  • RabbitMQ--基础篇
  • Android Studio 模拟器配置方案
  • 跨平台移动开发框架React Native和Flutter性能对比
  • 每周靶点分享:Angptl3、IgE、ADAM9及文献分享:抗体的多样性和特异性以及结构的新见解
  • 从代码学习深度学习 - 单发多框检测(SSD)PyTorch版
  • Comfyui 与 SDwebui
  • C++内存管理与模板初阶详解:从原理到实践
  • Java详解LeetCode 热题 100(13):LeetCode 53:最大子数组和(Maximum Subarray)详解