11. PyQt5实现多页面切换之QStackedLayout和QStackedWidget

实现多页面切换

多页面切换相关的类主要有QStackedLayout、QStackedWidget、QTabBar和QTabWidget等

一. QStackedLayout 类(分组布局或栈布局)

  1. 使用QStackedLayout可以实现一个多页面切换的界面,多页面切换就是类似于选项卡类型的界面。
    20221119215727

  2. QStackedLayout并没有直接实现多页面切换的版面,只是我们可以通过该类实现多页面切换的功能,因此要使用QStackedLayout类实现多页面切换,需要自行设计。

  3. QStackedLayout布局的基本原理是,在同一时间只显示其中的一个子部件,当前显示的子部件被称为当前部件(可见部件), 也就是说如果子部件是当前部件,它就是可见的。

  4. 实现多页面切换的基本步骤:

    • 使用QComboBox(组框)或 QListWidget(列表)之类的部件,提供给用户一个选择需要
      显示的页面的选项。
    • 创建一个容器(比如 QWidget 实例),然后在该容器中添加需要显示给用户的内容
    • 把容器添加到 QStackedLayout 布局中
    • 把 QComboBox 的 activated 信号(或类似信号)与 QStackedLayout 的 setCurrentIndex 槽
      相关联,以实现当用户选择 QComboBox 中的选项时,显示 QStackedLayout 布局中
      的子部件。 setCurrentIndex 槽的作用就是使 QStackedLayout 布局中的某一个子部件可
  5. QStackedLayout 类中的属性

    • count: const int
      访问函数: virtual int count() const; QLayout::count()的重新实现,返回布局中的项目数
    • currentIndex: int
      访问函数: int currentIndex() const; void setCurrentIndex(int index) //槽
      信号: currentChanged(int index);
    • stackingMode: StackingMode
      访问函数: StackingMode stackingMode() const; void setStackingMode(StackingMode);
      获取和设置子部件的显示方式,默认为 StackOne。 StackingMode 枚举取值如下:
      QStackedLayout::StackOne(值为 0):只有当前部件可见(默认值)
      QStackedLayout::StackAll(值为 1):所有部件均可见,当前部件只是被提升(即当前部件
      被提升到其他部件的前面)
  6. QStackedLayout 类中的方法
    参考https://www.riverbankcomputing.com/static/Docs/PyQt5/api/qtwidgets/qstackedlayout.html?highlight=qstackedlayout#QStackedLayout

  7. QStackedLayout 类的核心是 setCurrentIndex(int)和 setCurrentWidget(QWidget*)槽函数,要删除布局中的部件,可使用 QLayout::removeWidget()函数,要获取布局中子部件的索引需使用 QLayout::indexOf()函数。

使用 QStackedLayout 布局实现简单的多页面切换,实例代码如下

from PyQt5.QtWidgets import QApplication, QWidget, QStackedLayout, QVBoxLayout
from PyQt5.QtWidgets import QPushButton, QComboBox, QSizePolicy
import sys

if __name__ == '__main__':
  app = QApplication(sys.argv)

  my_widget = QWidget()
  my_widget_1 = QWidget(my_widget)
  my_widget_2 = QWidget()

  # 容器my_widget_1使用QVBoxLayout布局,布局中包含2个button
  my_page1_btn1 = QPushButton('A')
  my_page1_btn2 = QPushButton('B')

  # page1中将2个button加入QVBoxLayout布局
  my_page1_vbox_layout = QVBoxLayout()
  my_page1_vbox_layout.addWidget(my_page1_btn1)
  my_page1_vbox_layout.addWidget(my_page1_btn2)
  my_widget_1.setLayout(my_page1_vbox_layout)


  # 容器my_widget_2也使用QVBoxLayout布局,布局中包含2个button
  my_page2_btn1 = QPushButton('C')
  my_page2_btn2 = QPushButton('D')

  #page2中将2个button加入QVBoxLayout布局
  my_page2_vbox_layout = QVBoxLayout()
  my_page2_vbox_layout.addWidget(my_page2_btn1)
  my_page2_vbox_layout.addWidget(my_page2_btn2)
  my_widget_2.setLayout(my_page2_vbox_layout)

  # 将两个页面加入到QStackedLayout中
  my_stacked_layout = QStackedLayout()
  my_stacked_layout.addWidget(my_widget_1)
  my_stacked_layout.addWidget(my_widget_2)

  # 定义一个combobox用于选择分页
  my_combo_box = QComboBox()
  my_combo_box.addItem('page1')
  my_combo_box.addItem('page2')
  my_combo_box.setMinimumWidth(100)
  my_combo_box.setSizePolicy(QSizePolicy.Policy.Fixed, QSizePolicy.Policy.Fixed)

  # 顶层窗口上,使用QVBoxLayout布局,进行展示
  my_page_vbox_layout = QVBoxLayout()
  my_page_vbox_layout.addWidget(my_combo_box)
  my_page_vbox_layout.addLayout(my_stacked_layout)
  my_widget.setLayout(my_page_vbox_layout)

  # 关联信号和槽以实现多页面切换(关键步骤)
  my_combo_box.activated[int].connect(my_stacked_layout.setCurrentIndex)

  my_widget.show()

  sys.exit(app.exec_())

运行效果图:

20221119235428
20221119235451

二. QStackedWidget 类

QStackedWidget 类是在 QStackedLayout 之上构造的一个便利的部件,其使用方法与步骤和 QStackedLayout 是一样的。 QStackedWidget 类的成员函数与 QStackedLayout 类也基本上是一致的,使用该类就和使用 QStackedLayout 一样,因此该类就不重复讲述了。

  • 3
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: QtStackedWidget是一个用于管理多个页面Qt小部件。它允许用户在不同的页面之间进行切换,从而实现多个页面的展示和管理。在使用QtStackedWidget时,可以通过调用setCurrentIndex()函数来切换页面,也可以通过setCurrentWidget()函数来切换到指定的小部件。此外,还可以使用QStackedLayout类来管理QtStackedWidget的布局。 ### 回答2: QtStackedWidgetQt中一种页面切换的控件,可以方便地实现多个页面之间的切换和显示。在界面中经常需要根据用户操作展示不同的页面,比如登录、注册、主菜单、设置等等。 首先,我们需要将需要展示的页面添加到QtStackedWidget中。可以通过Qt Designer或者代码实现。在Qt Designer中,可以直接将需要展示的页面拖拽到QtStackedWidget控件中,也可以通过右键进行添加和删除等操作。在代码中,我们需要创建各个页面并添加到QtStackedWidget中,比如: ``` QWidget* loginPage = new QWidget(); stackedWidget->addWidget(loginPage); QWidget* regPage = new QWidget(); stackedWidget->addWidget(regPage); QWidget* mainMenu = new QWidget(); stackedWidget->addWidget(mainMenu); QWidget* settings = new QWidget(); stackedWidget->addWidget(settings); ``` 接下来,在实际使用中需要根据用户的操作来展示对应的页面。比如,在登录页面中,用户点击了注册按钮,则需要切换到注册页面。在注册页面中,用户输入完毕后,点击完成,则需要切换回登录页面。 可以通过QtStackedWidget提供的setCurrentIndex和setCurrentWidget函数来实现页面切换。setCurrentIndex接受一个整数参数,表示需要切换页面QtStackedWidget中的索引,从0开始。setCurrentWidget接受一个QWidget指针参数,表示需要切换页面。 在登录页面中: ``` // 切换到注册页面 connect(ui->registerButton, &QPushButton::clicked, [=]() { stackedWidget->setCurrentIndex(1); }); ``` 在注册页面中: ``` // 切换到登录页面 connect(ui->finishButton, &QPushButton::clicked, [=]() { stackedWidget->setCurrentWidget(loginPage); }); ``` 通过以上代码,用户点击登录页面的注册按钮即可切换到注册页面;在注册页面中,用户点击完成按钮即可切换回登录页面。 除了setCurrentIndex和setCurrentWidgetQtStackedWidget还提供了一些其他的函数,如count()获取页面数量,currentIndex()获取当前展示的页面索引,currentWidget()获取当前展示的页面QWidget指针等等。可以根据需求进行选择和使用。 总之,QtStackedWidget提供了一种简单、灵活的多页面切换方案,适用于各种应用场景。 ### 回答3: QtStackedWidget是一种用于切换界面页面的小部件。它可以容纳多个页面,并且在应用程序中的不同页面之间自由切换。一般情况下,QtStackedWidget常用于构建具有复杂界面和多个操作页面的应用程序。 使用QtStackedWidget的过程如下: 1.包含QtStackedWidget头文件 要使用QtStackedWidget,需要包含其头文件。 ```cpp #include <QtWidgets> ``` 2.创建QtStackedWidget 在需要显示QtStackedWidget的地方创建它。 ```cpp stackedWidget = new QStackedWidget(this); setCentralWidget(stackedWidget); ``` 3.添加页面QtStackedWidget添加页面。 ```cpp page1 = new QWidget; page2 = new QWidget; page3 = new QWidget; stackedWidget->addWidget(page1); stackedWidget->addWidget(page2); stackedWidget->addWidget(page3); ``` 4.关联切换按钮 创建活动按钮,并在QtStackedWidget中为每个页面附加一个索引。这是在单击按钮时完成的。 ```cpp connect(button1, SIGNAL(clicked()), this, SLOT(button1_clicked())); connect(button2, SIGNAL(clicked()), this, SLOT(button2_clicked())); connect(button3, SIGNAL(clicked()), this, SLOT(button3_clicked())); void MainWindow::button1_clicked() { stackedWidget->setCurrentIndex(0); } void MainWindow::button2_clicked() { stackedWidget->setCurrentIndex(1); } void MainWindow::button3_clicked() { stackedWidget->setCurrentIndex(2); } ``` 5.显示页面 通过设置QtStackedWidget的索引来显示页面。 ```cpp stackedWidget->setCurrentIndex(0); ``` 上述过程是使用QtStackedWidget的基本步骤,通过这种方法可以实现非常复杂的页面切换QtStackedWidget是一种非常有用的小部件,可以用于构建针对特定任务或功能的专用用户界面。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

smart_cat

你的鼓励将是我写作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值