当前位置:   article > 正文

Qt QStackedWidget类详细分析

qstackedwidget

一.定义 

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

QStackedWidget类的常用方法包括:

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

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

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

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

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

二.代码示例: 

  1. #include <QApplication>
  2. #include <QStackedWidget>
  3. #include <QLabel>
  4. int main(int argc, char *argv[])
  5. {
  6. QApplication app(argc, argv);
  7. QStackedWidget stackedWidget;
  8. QLabel *page1 = new QLabel("Page 1");
  9. QLabel *page2 = new QLabel("Page 2");
  10. stackedWidget.addWidget(page1);
  11. stackedWidget.addWidget(page2);
  12. stackedWidget.setCurrentIndex(0);
  13. stackedWidget.show();
  14. return app.exec();
  15. }

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

三.对部件进行类型转换 

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

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

  1. QLabel *label = qobject_cast<QLabel*>(stackedWidget.widget(0));
  2. if (label) {
  3. // 在这里执行QLabel特定的操作
  4. label->setText("Modified Page 1");
  5. }

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

 QStackedWidget确定当前索引的方式

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

示例代码: 

  1. #include <QApplication>
  2. #include <QWidget>
  3. #include <QListWidget>
  4. #include <QVBoxLayout>
  5. #include <QPushButton>
  6. #include <QStackedWidget>
  7. int main(int argc, char *argv[]) {
  8. QApplication app(argc, argv);
  9. QWidget mainWidget;
  10. QVBoxLayout layout(&mainWidget);
  11. QStackedWidget stackedWidget;
  12. QListWidget listWidget1;
  13. for(int i = 1; i <= 5; i++) {
  14. listWidget1.addItem(QString("Item %1").arg(i));
  15. }
  16. QListWidget listWidget2;
  17. for(int i = 6; i <= 10; i++) {
  18. listWidget2.addItem(QString("Item %1").arg(i));
  19. }
  20. stackedWidget.addWidget(&listWidget1);
  21. stackedWidget.addWidget(&listWidget2);
  22. QPushButton button1("Show List 1");
  23. QPushButton button2("Show List 2");
  24. QObject::connect(&button1, &QPushButton::clicked, [&](){
  25. stackedWidget.setCurrentIndex(0);
  26. });
  27. QObject::connect(&button2, &QPushButton::clicked, [&](){
  28. stackedWidget.setCurrentIndex(1);
  29. });
  30. layout.addWidget(&button1);
  31. layout.addWidget(&button2);
  32. layout.addWidget(&stackedWidget);
  33. mainWidget.setLayout(&layout);
  34. mainWidget.show();
  35. return app.exec();
  36. }

切换显示

  1. // 创建一个 QStackedWidget
  2. QStackedWidget *stackedWidget = new QStackedWidget(this);
  3. // 创建 LargeFormWidget
  4. QListWidget *LargeFormWidget = new QListWidget();
  5. // 在 LargeFormWidget 中添加项和小部件
  6. // ...
  7. // 将 LargeFormWidget 添加到 stackedWidget 中
  8. stackedWidget->addWidget(LargeFormWidget);
  9. // 创建其他布局,例如另一个 QListWidget
  10. QListWidget *otherWidget = new QListWidget();
  11. // 在 otherWidget 中添加项和小部件
  12. // ...
  13. // 将 otherWidget 添加到 stackedWidget 中
  14. stackedWidget->addWidget(otherWidget);
  15. //...添加其他布局
  16. // 设置初始显示的布局
  17. stackedWidget->setCurrentWidget(LargeFormWidget);
  18. // 将 stackedWidget 添加到主窗口中
  19. QVBoxLayout *layout = new QVBoxLayout(this);
  20. layout->addWidget(stackedWidget);
  21. setLayout(layout);
  22. // 在需要切换显示布局的地方,使用下面的代码
  23. stackedWidget->setCurrentWidget(otherWidget); // 切换到其他布局

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/空白诗007/article/detail/961205
推荐阅读
相关标签
  

闽ICP备14008679号