一、QStackedWidget概述
在 Qt 中,堆栈窗口通常指的是 QStackedWidget
控件,它是用于管理多个子窗口或页面的堆叠式容器。QStackedWidget
允许你在一个固定区域内显示多个子窗口,但同时只显示其中一个子窗口,其他子窗口则被堆叠在后面。这使得你可以创建多页的界面,如向导、选项卡或其他多视图应用程序。
以下是有关 QStackedWidget
的详细介绍和使用方法:
-
多页容器:
QStackedWidget
是一个多页容器,允许你将多个子窗口放在一个固定区域内。 -
单页显示:在任何给定时间,只有一个子窗口是可见的,其他子窗口被隐藏,可以通过切换来显示不同的子窗口。
-
切换效果:你可以通过切换页面的方式,如设置当前页或使用动画效果,切换可见的子窗口。
二、常用函数介绍
1.addWidget:将子窗口或页面添加到 QStackedWidget
QStackedWidget *stackedWidget = new QStackedWidget; QWidget *page1 = new QWidget; QWidget *page2 = new QWidget; stackedWidget->addWidget(page1); 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 信号:在子窗口切换时触发的信号
QObject::connect(stackedWidget, &QStackedWidget::currentChanged, [&](int index) { qDebug() << "当前子窗口索引已更改:" << index; });
8.stackedWidget->setCurrentWidget(page2); // 显示第二个子窗口
stackedWidget->setCurrentWidget(page2); // 显示第二个子窗口
9.currentWidget:获取当前显示的子窗口的指针
QWidget *currentPage = stackedWidget->currentWidget();
10.slideInNext 和 slideInPrev:切换到下一个或上一个子窗口,带有滑动效果
stackedWidget->slideInNext(); stackedWidget->slideInPrev();
这些函数可以帮助你配置和管理 QStackedWidget
控件,以便在一个固定区域内显示多个子窗口,并根据需要切换它们。你可以使用这些函数来创建多页的用户界面,如向导、选项卡和多视图应用程序。通过连接 currentChanged
信号,你还可以监测子窗口的切换事件。
三、示例代码
#include "main_window.h" MainWindow::MainWindow(QWidget *parent) : QWidget(parent) { this->setFixedSize(600, 400); // 创建一个堆叠窗口 m_pStackedWidget = new QStackedWidget(this); // 创建多个子窗口或页面 QWidget *page1 = new QWidget(this); page1->setStyleSheet("QWidget{background-color:rgb(255, 0, 0)}"); QWidget *page2 = new QWidget(this); page2->setStyleSheet("QWidget{background-color:rgb(255, 255, 0)}"); QWidget *page3 = new QWidget(this); page3->setStyleSheet("QWidget{background-color:rgb(255, 0, 255)}"); // 添加页面到堆叠窗口 m_pStackedWidget->addWidget(page1); m_pStackedWidget->addWidget(page2); m_pStackedWidget->addWidget(page3); // 创建按钮用于切换页面 QPushButton *pPevButton = new QPushButton("上一页", this); connect(pPevButton, &QPushButton::clicked, this, &MainWindow::onPrevButtonClicked); QPushButton *pNextButton = new QPushButton("下一页", this); connect(pNextButton, &QPushButton::clicked, this, &MainWindow::onNextButtonClicked); // 在页面上添加一些控件 // ... // 显示第一个页面 m_pStackedWidget->setCurrentIndex(0); // 布局页面和按钮 QVBoxLayout *layout = new QVBoxLayout; layout->addWidget(m_pStackedWidget); layout->addWidget(pNextButton); layout->addWidget(pPevButton); this->setLayout(layout); } MainWindow::~MainWindow() { } void MainWindow::onPrevButtonClicked() { int nextPage = (m_pStackedWidget->currentIndex() + 1) % m_pStackedWidget->count(); m_pStackedWidget->setCurrentIndex(nextPage); } void MainWindow::onNextButtonClicked() { int prevPage = (m_pStackedWidget->currentIndex() - 1 + m_pStackedWidget->count()) % m_pStackedWidget->count(); m_pStackedWidget->setCurrentIndex(prevPage); }
效果展示: