Qt之堆栈窗口(QStackedWidget)

发布时间 2023-10-27 16:05:21作者: TechNomad

一、QStackedWidget概述

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

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

  1. 多页容器:QStackedWidget 是一个多页容器,允许你将多个子窗口放在一个固定区域内。

  2. 单页显示:在任何给定时间,只有一个子窗口是可见的,其他子窗口被隐藏,可以通过切换来显示不同的子窗口。

  3. 切换效果:你可以通过切换页面的方式,如设置当前页或使用动画效果,切换可见的子窗口。

二、常用函数介绍

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);
}

效果展示: