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

QStackedWidget使用实例

制作一个页面X,该页面X中有两个按钮a,b;和两个页面A,B。要求点击按钮a时,显示页面A。点击按钮b时,显示页面B。
要求按钮位于页面A或B的上方,并且依次由左向右间隔排列。
要求将页面A分为两个子页面A1和A2,将页面B分为两个子页面B1和B2。

可以通过简单的父子关系来实现页面A中的子页面A1和A2,以及页面B中的子页面B1和B2。我们将页面A和页面B分别用垂直布局包含子页面A1、A2和B1、B2。这样,A1、A2和B1、B2会直接显示在页面A和页面B中,而无需额外的点击切换。

以下是完整代码。

目录结构

project/
├── main.cpp
├── MainWindow.h
└── MainWindow.cpp

代码实现

MainWindow.h - 主窗口头文件
#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QPushButton>
#include <QStackedWidget>
#include <QWidget>class MainWindow : public QMainWindow {Q_OBJECTpublic:explicit MainWindow(QWidget *parent = nullptr);private:QPushButton *buttonA;            // 按钮a,用于显示页面AQPushButton *buttonB;            // 按钮b,用于显示页面BQStackedWidget *stackedWidget;   // 页面堆叠控件,用于管理页面A和页面BQWidget *pageA;                  // 页面AQWidget *pageB;                  // 页面BQWidget *subPageA1;              // 页面A的子页面A1QWidget *subPageA2;              // 页面A的子页面A2QWidget *subPageB1;              // 页面B的子页面B1QWidget *subPageB2;              // 页面B的子页面B2
};#endif // MAINWINDOW_H
MainWindow.cpp - 主窗口实现文件
#include "MainWindow.h"
#include <QVBoxLayout>
#include <QHBoxLayout>MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) {// 创建中央控件,用于承载所有的子控件QWidget *centralWidget = new QWidget(this);setCentralWidget(centralWidget);// 创建按钮 "a" 和 "b"buttonA = new QPushButton("Show Page A", this);buttonB = new QPushButton("Show Page B", this);// 创建页面A和页面BpageA = new QWidget(this);pageB = new QWidget(this);// 创建页面A的子页面A1和A2subPageA1 = new QWidget(pageA);subPageA2 = new QWidget(pageA);subPageA1->setStyleSheet("background-color: lightcyan;");subPageA2->setStyleSheet("background-color: lightcoral;");// 将子页面A1和A2添加到页面A的布局中QVBoxLayout *pageALayout = new QVBoxLayout(pageA);pageALayout->addWidget(subPageA1);pageALayout->addWidget(subPageA2);// 创建页面B的子页面B1和B2subPageB1 = new QWidget(pageB);subPageB2 = new QWidget(pageB);subPageB1->setStyleSheet("background-color: lightyellow;");subPageB2->setStyleSheet("background-color: lightpink;");// 将子页面B1和B2添加到页面B的布局中QVBoxLayout *pageBLayout = new QVBoxLayout(pageB);pageBLayout->addWidget(subPageB1);pageBLayout->addWidget(subPageB2);// 使用QStackedWidget来存放页面A和页面BstackedWidget = new QStackedWidget(this);stackedWidget->addWidget(pageA); // index 0stackedWidget->addWidget(pageB); // index 1// 创建一个水平布局用于放置按钮QHBoxLayout *buttonLayout = new QHBoxLayout();buttonLayout->addWidget(buttonA);buttonLayout->addWidget(buttonB);// 创建一个垂直布局用于整体布局QVBoxLayout *mainLayout = new QVBoxLayout(centralWidget);mainLayout->addLayout(buttonLayout);   // 将按钮布局添加到主布局的顶部mainLayout->addWidget(stackedWidget);  // 将页面堆叠控件添加到主布局的底部// 连接按钮和页面切换的槽函数connect(buttonA, &QPushButton::clicked, this, [=]() {stackedWidget->setCurrentIndex(0); // 显示页面A});connect(buttonB, &QPushButton::clicked, this, [=]() {stackedWidget->setCurrentIndex(1); // 显示页面B});
}
main.cpp - 主程序入口
#include <QApplication>
#include "MainWindow.h"int main(int argc, char *argv[]) {QApplication app(argc, argv);MainWindow mainWindow;mainWindow.setWindowTitle("Page Switcher with Subpages"); // 设置主窗口标题mainWindow.resize(400, 300);                              // 设置主窗口大小mainWindow.show();                                        // 显示主窗口return app.exec(); // 启动应用程序事件循环
}

代码说明

  • 子页面A1、A2和B1、B2:直接作为页面A和页面B的子控件,通过垂直布局加入各自的页面。
  • 布局与页面结构
    • QVBoxLayout *pageALayout:用于页面A的垂直布局,将subPageA1subPageA2加入。
    • QVBoxLayout *pageBLayout:用于页面B的垂直布局,将subPageB1subPageB2加入。

运行效果

  • 程序启动后显示主窗口,顶部有两个按钮“Show Page A”和“Show Page B”。
  • 点击“Show Page A”时显示页面A,包括两个子页面A1和A2,背景色分别为淡青色和淡珊瑚色。
  • 点击“Show Page B”时显示页面B,包括两个子页面B1和B2,背景色分别为淡黄色和淡粉色。

http://www.mrgr.cn/news/66444.html

相关文章:

  • FBX福币交易所A股三大指数小幅低开 稀土永磁板块回调
  • Liunx安装MYSQL
  • 文献阅读 | Nature Methods:空间转录组数据的对齐和整合
  • Android沙箱
  • 智算中心建设热潮涌动 AI服务器赋能加速
  • SystemC简明教程
  • Java 基于SpringBoot+Vue 的公交智能化系统,附源码、文档
  • 【C++篇】在秩序与混沌的交响乐中: STL之map容器的哲学探寻
  • 一些常规IP核功能
  • HOT100_最大子数组和
  • 一款功能强大的开源文档管理系统,将物理文档转换为可搜索的在线档案,实现无纸化办公工具(带私活源码)
  • Spring Data Redis的基本使用
  • 【大模型】深度解析:智能体如何突破 RAG 的三大技术瓶颈
  • 力扣最热一百题——验证二叉搜索树
  • 七牛云OSS的使用
  • QT/QT QUICK与前端WEB开发的区别
  • 深入理解对象池 sync.Pool
  • css过渡用法
  • AutoCAD2024
  • CLIP-Driven Universal Model for Organ Segmentation and Tumor Detection论文解读和实验复现
  • 数据采集之超级鹰验证码识别及模拟登录
  • Go 中的 Context实现原理以及正确使用方式
  • 小白直接冲!BiTCN-BiLSTM-Attention双向时间卷积双向长短期记忆神经网络融合注意力机制多变量回归预测
  • vite+vue项目创建流程;npm error enoent Could not read package.json异常报错问题
  • 鸿蒙移动应用开发-------初始arkts
  • leetcode动态规划(二十九)-最大子数组和