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); // 切换到其他布局
相关推荐
一只大袋鼠16 分钟前
Git 进阶(二):分支管理、暂存栈、远程仓库与多人协作
java·开发语言·git
LuminousCPP1 小时前
数据结构 - 线性表第四篇:C 语言通讯录优化升级全记录(踩坑 + 思考)
c语言·开发语言·数据结构·经验分享·笔记·学习
web3.08889991 小时前
1688 图搜接口(item_search_img / 拍立淘) 接入方法
开发语言·python
один but you2 小时前
从可变参数到 emplace:现代 C++ 性能优化的核心组合
java·开发语言
MY_TEUCK3 小时前
【Java 后端 | Nacos 注册中心】微服务治理原理、选型与注册发现实战
java·开发语言·微服务
测试员周周3 小时前
【Appium 系列】第13节-混合测试执行器 — API + UI 的协同执行
开发语言·人工智能·python·功能测试·ui·appium·pytest
光泽雨3 小时前
c#中的Type类型
开发语言·前端
见叶之秋4 小时前
C++基础入门指南
开发语言·c++
计算机安禾4 小时前
【c++面向对象编程】第42篇:模板特化与偏特化:为特定类型定制实现
开发语言·c++·算法
qq_401700414 小时前
Qt 项目中使用 QSS 的全面总结
开发语言·qt