一、QStackedWidget概述
在 Qt 中,堆栈窗口通常指的是 QStackedWidget 控件,它是用于管理多个子窗口或页面的堆叠式容器。QStackedWidget 允许你在一个固定区域内显示多个子窗口,但同时只显示其中一个子窗口,其他子窗口则被堆叠在后面。这使得你可以创建多页的界面,如向导、选项卡或其他多视图应用程序。
以下是有关 QStackedWidget 的详细介绍和使用方法:
- 多页容器:QStackedWidget 是一个多页容器,允许你将多个子窗口放在一个固定区域内。
- 单页显示:在任何给定时间,只有一个子窗口是可见的,其他子窗口被隐藏,可以通过切换来显示不同的子窗口。
- 切换效果:你可以通过切换页面的方式,如设置当前页或使用动画效果,切换可见的子窗口。
二、常用函数介绍
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 }
效果展示: