QStackedWidget使用实例

news/2024/11/6 11:16:39 标签: qt5

制作一个页面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_OBJECT

public:
    explicit MainWindow(QWidget *parent = nullptr);

private:
    QPushButton *buttonA;            // 按钮a,用于显示页面A
    QPushButton *buttonB;            // 按钮b,用于显示页面B
    QStackedWidget *stackedWidget;   // 页面堆叠控件,用于管理页面A和页面B
    QWidget *pageA;                  // 页面A
    QWidget *pageB;                  // 页面B
    QWidget *subPageA1;              // 页面A的子页面A1
    QWidget *subPageA2;              // 页面A的子页面A2
    QWidget *subPageB1;              // 页面B的子页面B1
    QWidget *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和页面B
    pageA = new QWidget(this);
    pageB = new QWidget(this);

    // 创建页面A的子页面A1和A2
    subPageA1 = 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和B2
    subPageB1 = 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和页面B
    stackedWidget = new QStackedWidget(this);
    stackedWidget->addWidget(pageA); // index 0
    stackedWidget->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.niftyadmin.cn/n/5740813.html

相关文章

Go 中的 Context实现原理以及正确使用方式

在 Go 语言中&#xff0c;Context 包是一种非常常用的工具&#xff0c;它被用来管理 goroutine 之间的通信和取消。本文将深入探讨Context 包的基本原理&#xff0c;包括使用场景、原理和一些最佳实践。 1. 基本原理 1.1 Context 包的介绍 在 Go 语言中&#xff0c;Context 包…

mysql error:1449权限问题 及 用户授权

一、权限问题 Got error: 1449: The user specified as a definer (skip-grants userskip-grants host) does not exist when using LOCK TABLES 在迁移数据库时&#xff0c;定义的definer&#xff0c;在两个数据库之间不同步时&#xff0c;要将不存在的definer改成数据库中已…

【青牛科技】GC2803:白色家电与安防领域中 ULN2803 的卓越替代者

在当今科技飞速发展的时代&#xff0c;电子元器件在各个领域都扮演着至关重要的角色。在白色家电和安防等产品的电路设计中&#xff0c;驱动芯片的选择尤为关键。传统的 ULN2803 曾是广泛应用的一款芯片&#xff0c;但如今&#xff0c;芯麦 GC2803 的出现为这些领域带来了新的选…

JAVA基础:数组 (习题笔记)

一&#xff0c;编码题 1&#xff0c;数组查找操作&#xff1a;定义一个长度为10 的一维字符串数组&#xff0c;在每一个元素存放一个单词&#xff1b;然后运行时从命令行输入一个单词&#xff0c;程序判断数组是否包含有这个单词&#xff0c;包含这个单词就打印出“Yes”&…

IntelliJ IDEA 中创建目录时 `.` 和 `/` 的区别

前言 在使用 IntelliJ IDEA 进行项目开发时&#xff0c;合理地组织项目结构对于提高开发效率至关重要。尤其是在创建多级目录时&#xff0c;正确选择分隔符能够避免很多不必要的麻烦。本文将详细介绍在 IntelliJ IDEA 中创建目录时使用 . 和 / 的区别及其应用场景。 1. 使用 …

CPP贪心算法示例

设有n个正整数&#xff08;n ≤ 20&#xff09;&#xff0c;将它们联接成一排&#xff0c;组成一个最大的多位整数。 例如&#xff1a;n3时&#xff0c;3个整数13&#xff0c;312&#xff0c;343联接成的最大整数为&#xff1a;34331213 又如&#xff1a;n4时&#xff0c;4个整…

asp.net+uniapp养老助餐管理系统 微信小程序

文章目录 项目介绍具体实现截图技术介绍mvc设计模式小程序框架以及目录结构介绍错误处理和异常处理java类核心代码部分展示详细视频演示源码获取 项目介绍 以往流浪猫狗的救助网站相关信息的管理&#xff0c;都是工作人员手工统计。这种方式不但时效性低&#xff0c;而且需要查…

Jest进阶:测试 Vue 组件

在 Vue 项目中&#xff0c;测试组件是确保应用质量和稳定性的关键步骤。Vue Test Utils 是一个专门为 Vue.js 应用程序编写的单元测试和集成测试工具库。它提供了丰富的 API&#xff0c;帮助开发者模拟用户操作、查询组件和断言测试结果&#xff0c;从而在不需要手动操作应用程…