Qt QStackedWidget类详细分析

一.定义

QStackedWidget类是一个容器控件,它提供了一个堆叠的页面布局方式,每个页面可以包含一个子部件。在QStackedWidget中,只有当前活动的页面是可见的,其他页面会被隐藏起来。

QStackedWidget类的常用方法包括:

  1. addWidget(widget):向QStackedWidget中添加一个子部件。

  2. insertWidget(index, widget):在指定的索引处插入一个子部件。

  3. setCurrentIndex(index):设置当前活动页面的索引。

  4. currentWidget():返回当前活动的子部件。

  5. count():返回子部件的数量。

二.代码示例:

cpp 复制代码
#include <QApplication>
#include <QStackedWidget>
#include <QLabel>

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    QStackedWidget stackedWidget;

    QLabel *page1 = new QLabel("Page 1");
    QLabel *page2 = new QLabel("Page 2");

    stackedWidget.addWidget(page1);
    stackedWidget.addWidget(page2);

    stackedWidget.setCurrentIndex(0);

    stackedWidget.show();

    return app.exec();
}

在这个例子中,我们创建了一个QStackedWidget对象,并向其中添加了两个QLabel部件作为页面。然后通过setCurrentIndex方法将第一个页面设置为当前活动页面,并显示了QStackedWidget。在运行程序时,我们会看到第一个页面被显示出来,而第二个页面被隐藏。

三.对部件进行类型转换

如果需要在QStackedWidget中的部件上执行特定类型的操作,可以使用qobject_cast来转换部件的类型。qobject_cast是Qt提供的一个安全的类型转换方法,它可以检查对象的类型,并在转换不可行时返回nullptr。

例如,如果我们在上面的例子中的page1部件上执行QLabel特定的操作,可以使用qobject_cast进行类型转换

cpp 复制代码
QLabel *label = qobject_cast<QLabel*>(stackedWidget.widget(0));
if (label) {
    // 在这里执行QLabel特定的操作
    label->setText("Modified Page 1");
}

在这个示例中,我们使用qobject_cast将第一个页面widget转换为QLabel类型,并在转换成功的情况下,可以安全地在该部件上执行QLabel特定的操作。

QStackedWidget确定当前索引的方式

当向QStackedWidget中添加窗口部件时,它们将按照它们被添加的顺序来进行索引排序。第一个添加的窗口部件将被赋予索引0,第二个将被赋予索引1,依此类推。因此,当前索引是根据窗口部件添加的顺序来确定的。

示例代码:

cpp 复制代码
#include <QApplication>
#include <QWidget>
#include <QListWidget>
#include <QVBoxLayout>
#include <QPushButton>
#include <QStackedWidget>

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    QWidget mainWidget;
    QVBoxLayout layout(&mainWidget);

    QStackedWidget stackedWidget;

    QListWidget listWidget1;
    for(int i = 1; i <= 5; i++) {
        listWidget1.addItem(QString("Item %1").arg(i));
    }

    QListWidget listWidget2;
    for(int i = 6; i <= 10; i++) {
        listWidget2.addItem(QString("Item %1").arg(i));
    }

    stackedWidget.addWidget(&listWidget1);
    stackedWidget.addWidget(&listWidget2);

    QPushButton button1("Show List 1");
    QPushButton button2("Show List 2");

    QObject::connect(&button1, &QPushButton::clicked, [&](){
        stackedWidget.setCurrentIndex(0);
    });

    QObject::connect(&button2, &QPushButton::clicked, [&](){
        stackedWidget.setCurrentIndex(1);
    });

    layout.addWidget(&button1);
    layout.addWidget(&button2);
    layout.addWidget(&stackedWidget);

    mainWidget.setLayout(&layout);
    mainWidget.show();

    return app.exec();
}

切换显示

cpp 复制代码
// 创建一个 QStackedWidget
QStackedWidget *stackedWidget = new QStackedWidget(this);

// 创建 LargeFormWidget
QListWidget *LargeFormWidget = new QListWidget();
// 在 LargeFormWidget 中添加项和小部件
// ...

// 将 LargeFormWidget 添加到 stackedWidget 中
stackedWidget->addWidget(LargeFormWidget);

// 创建其他布局,例如另一个 QListWidget
QListWidget *otherWidget = new QListWidget();
// 在 otherWidget 中添加项和小部件
// ...

// 将 otherWidget 添加到 stackedWidget 中
stackedWidget->addWidget(otherWidget);

//...添加其他布局

// 设置初始显示的布局
stackedWidget->setCurrentWidget(LargeFormWidget);

// 将 stackedWidget 添加到主窗口中
QVBoxLayout *layout = new QVBoxLayout(this);
layout->addWidget(stackedWidget);
setLayout(layout);

// 在需要切换显示布局的地方,使用下面的代码
stackedWidget->setCurrentWidget(otherWidget); // 切换到其他布局
相关推荐
binishuaio5 分钟前
Java 第11天 (git版本控制器基础用法)
java·开发语言·git
zz.YE6 分钟前
【Java SE】StringBuffer
java·开发语言
就是有点傻11 分钟前
WPF中的依赖属性
开发语言·wpf
洋24019 分钟前
C语言常用标准库函数
c语言·开发语言
进击的六角龙21 分钟前
Python中处理Excel的基本概念(如工作簿、工作表等)
开发语言·python·excel
wrx繁星点点22 分钟前
状态模式(State Pattern)详解
java·开发语言·ui·设计模式·状态模式
NoneCoder39 分钟前
Java企业级开发系列(1)
java·开发语言·spring·团队开发·开发
苏三有春39 分钟前
PyQt5实战——UTF-8编码器功能的实现(六)
开发语言·qt
Aniay_ivy1 小时前
深入探索 Java 8 Stream 流:高效操作与应用场景
java·开发语言·python
Vanranrr1 小时前
C++ QT
java·c++·qt