一、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);
}
效果展示: