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); // 切换到其他布局
相关推荐
用户805533698034 天前
不止三件套:QObject 属性系统全关键字与运行时反射!
c++·qt
xcyxiner4 天前
DicomViewer (vcpkg Windows和ubuntu编译)7
qt
Quz9 天前
QML Hello World 入门示例
qt
xcyxiner12 天前
DicomViewer (dcmtk读取dcm文件)5
qt
xcyxiner13 天前
DicomViewer (后台线程处理文件)4
qt
xcyxiner13 天前
DicomViewer (添加模型类)3
qt
xcyxiner14 天前
DicomViewer (目录调整) 2
qt
xcyxiner14 天前
dcmtk vtk vtk-dicom(gdcm) 编译(debug) v2
qt
LDR00616 天前
Type-C 快充全面升级!LDR6601 赋能个人护理便携电机,重塑剃须刀 / 理发器新体验
c语言·开发语言
雪碧聊技术16 天前
Tree.js是什么?一文讲透
开发语言·javascript·ecmascript