一杯清酒邀明月
天下本无事,庸人扰之而烦耳。

一、QStackedWidget概述

在 Qt 中,堆栈窗口通常指的是 QStackedWidget 控件,它是用于管理多个子窗口或页面的堆叠式容器。QStackedWidget 允许你在一个固定区域内显示多个子窗口,但同时只显示其中一个子窗口,其他子窗口则被堆叠在后面。这使得你可以创建多页的界面,如向导、选项卡或其他多视图应用程序。

以下是有关 QStackedWidget 的详细介绍和使用方法:

  1. 多页容器:QStackedWidget 是一个多页容器,允许你将多个子窗口放在一个固定区域内。
  2. 单页显示:在任何给定时间,只有一个子窗口是可见的,其他子窗口被隐藏,可以通过切换来显示不同的子窗口。
  3. 切换效果:你可以通过切换页面的方式,如设置当前页或使用动画效果,切换可见的子窗口。

二、常用函数介绍

1.addWidget:将子窗口或页面添加到 QStackedWidget

1 QStackedWidget *stackedWidget = new QStackedWidget;
2 QWidget *page1 = new QWidget;
3 QWidget *page2 = new QWidget;
4 stackedWidget->addWidget(page1);
5 stackedWidget->addWidget(page2);

2.removeWidget:从 QStackedWidget 中移除子窗口

stackedWidget->removeWidget(page1);

3.setCurrentIndex:设置当前显示的子窗口的索引

stackedWidget->setCurrentIndex(1); // 显示第二个子窗口

4.currentIndex:获取当前显示的子窗口的索引

int index = stackedWidget->currentIndex();

5.count:获取 QStackedWidget 中子窗口的数量

int numPages = stackedWidget->count();

6.widget:获取指定索引位置的子窗口

QWidget *page = stackedWidget->widget(0); // 获取第一个子窗口

7.widget 信号:在子窗口切换时触发的信号

1 QObject::connect(stackedWidget, &QStackedWidget::currentChanged, [&](int index) {
2     qDebug() << "当前子窗口索引已更改:" << index;
3 });

8.stackedWidget->setCurrentWidget(page2); // 显示第二个子窗口

stackedWidget->setCurrentWidget(page2); // 显示第二个子窗口

9.currentWidget:获取当前显示的子窗口的指针

QWidget *currentPage = stackedWidget->currentWidget();

10.slideInNext 和 slideInPrev:切换到下一个或上一个子窗口,带有滑动效果

1 stackedWidget->slideInNext();
2 stackedWidget->slideInPrev();

  这些函数可以帮助你配置和管理 QStackedWidget 控件,以便在一个固定区域内显示多个子窗口,并根据需要切换它们。你可以使用这些函数来创建多页的用户界面,如向导、选项卡和多视图应用程序。通过连接 currentChanged 信号,你还可以监测子窗口的切换事件。

三、示例代码

 1 #include "main_window.h"
 2  
 3 MainWindow::MainWindow(QWidget *parent)
 4     : QWidget(parent)
 5 {
 6     this->setFixedSize(600, 400);
 7  
 8     // 创建一个堆叠窗口
 9     m_pStackedWidget = new QStackedWidget(this);
10  
11     // 创建多个子窗口或页面
12     QWidget *page1 = new QWidget(this);
13     page1->setStyleSheet("QWidget{background-color:rgb(255, 0, 0)}");
14     QWidget *page2 = new QWidget(this);
15     page2->setStyleSheet("QWidget{background-color:rgb(255, 255, 0)}");
16     QWidget *page3 = new QWidget(this);
17     page3->setStyleSheet("QWidget{background-color:rgb(255, 0, 255)}");
18  
19     // 添加页面到堆叠窗口
20     m_pStackedWidget->addWidget(page1);
21     m_pStackedWidget->addWidget(page2);
22     m_pStackedWidget->addWidget(page3);
23  
24  
25     // 创建按钮用于切换页面
26     QPushButton *pPevButton = new QPushButton("上一页", this);
27     connect(pPevButton, &QPushButton::clicked, this, &MainWindow::onPrevButtonClicked);
28  
29     QPushButton *pNextButton = new QPushButton("下一页", this);
30     connect(pNextButton, &QPushButton::clicked, this, &MainWindow::onNextButtonClicked);
31  
32     // 在页面上添加一些控件
33     // ...
34  
35     // 显示第一个页面
36     m_pStackedWidget->setCurrentIndex(0);
37  
38     // 布局页面和按钮
39     QVBoxLayout *layout = new QVBoxLayout;
40     layout->addWidget(m_pStackedWidget);
41     layout->addWidget(pNextButton);
42     layout->addWidget(pPevButton);
43     this->setLayout(layout);
44 }
45  
46 MainWindow::~MainWindow()
47 {
48 }
49  
50 void MainWindow::onPrevButtonClicked()
51 {
52     int nextPage = (m_pStackedWidget->currentIndex() + 1) % m_pStackedWidget->count();
53     m_pStackedWidget->setCurrentIndex(nextPage);
54 }
55  
56 void MainWindow::onNextButtonClicked()
57 {
58     int prevPage = (m_pStackedWidget->currentIndex() - 1 + m_pStackedWidget->count()) % m_pStackedWidget->count();
59     m_pStackedWidget->setCurrentIndex(prevPage);
60 }

效果展示:

posted on 2024-06-28 11:19  一杯清酒邀明月  阅读(495)  评论(0编辑  收藏  举报