13. PyQt5实现多页面切换之QTabWidget

PyQt5实现多页面切换之QTabWidget

一、QTabWidget 类简介

  1. QTabWidget 类直接继承自 QWidget。该类提供了一个选项卡栏(QTabBar)和一个相应的页面区域,用于显示与每个选项卡相对应的页面。 与 QStackedLayout 布局原理相同,只有当前页面(即可见页面)是可见的,所有其他页面都不可见,用户可通过选择不同的选项卡来显示其对应的其他页面。
  2. 页面或页面部件:其实就是容器(通常使用 QWidget 创建)
  3. QTabWidget 类,是一个实现多页面切换的类,该类已经实现了多页面切换的部分功能,只需再对其进行少量的设计(主要是要设计页面中的内容)便可实现多页面切换了。 因此,使用该类实现多页面切换时,就不需要再使用 QStackedLayout 布局把页面与选项卡相关联,也不需要使用类似 QVBoxLayout 的布局把选项卡和页面放置在一起
  4. QTabWidget 类的大部分功能由 QTabBar(主要处理选项卡部分)和 QStackedWidget(主要处理组织页面的功能)提供。

二、QTabWidget 类的使用步骤

使用 QTabWidget 的步骤为:

  • 创建一个 QTabWidget
  • 为每个选项卡创建一个页面(容器),通常为 QWidget(不要指定父部件)
  • 把子部件插入到页面部件(即容器)中
  • 使用 addTab()或 insertTab()把页面部件放入选项卡部件
  • 若容器中的内容不可见,则使用 resize()函数设置 QTabWidget 的大小使其可见

大致的代码形式为:

my_tabwidget = QTabWidget() # 构造选项卡部件
widget1 = widget2 = widget3 = QWidget() # 创建容器
...... # 向容器中添加需要显示的内容,略
my_tabwidget.addTab(widget1, 'AAA') # 把容器widget1作为选项卡AAA的页面
my_tabwidget.addTab(widget2, 'BBB') # 把容器widget2作为选项卡BBB的页面
my_tabwidget.addTab(widget3, 'CCC') # 把容器widget3作为选项卡CCC的页面
......  # 其他业务代码

三、QTabWidget 类中的属性

QTabWidget 类中的属性和函数大多与 QTabBar 中的属性和函数是相同的
20221120163406
20221120163440
20221120163458

四、QTabWidget 类中的函数

详情请参考官方文档 https://www.riverbankcomputing.com/static/Docs/PyQt5/api/qtwidgets/qtabwidget.html?highlight=qtabwidget#QTabWidget

五、QTabWidget 类中的信号

  • void currentChanged(int index);
    当选项卡栏上的当前选项卡发生更改时发送此信号, index 为新选项卡的索引,若没有新的索引,则为−1(比如 QTabBar 中没有选项卡)。该信号比较重要。
  • void tabBarClicked(int index);
  • void tabBarDoubleClicked(int index);
    以上信号表示,单击或双击 index 处的选项卡时发送此信号, index 是单击选项卡的索引,若光标下没有选项卡,则为−1。
  • void tabCloseRequested(int index);
    当点击选项卡上的关闭按钮时发送此信号, index 为应删除的选项卡的索引。

六、QTabWidget 类示例代码

使用 QTabWidget 类(选项卡部件)实现多页面切换的示例代码如下:

from PyQt5.QtWidgets import QApplication, QWidget, QTabWidget, QRadioButton, QPushButton, QVBoxLayout
import sys

class MyTabWidget(QTabWidget):
  def __init__(self, parent=None) -> None:
    super().__init__(parent)

  def remove_tab_handler(self):
    '''
    槽函数, 移除索引为0的选项卡
    '''
    super().removeTab(0)


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

  top_widget = QWidget()

  # 创建3个容器
  tab1_widget = QWidget()
  tab2_widget = QWidget()
  tab3_widget = QWidget()

  # 创建一些子部件
  remove_tab_btn = QPushButton('removeTab')
  page1_radio1 = QRadioButton('A')
  page1_radio2 = QRadioButton('B')
  page2_radio1 = QRadioButton('C')
  page2_radio2 = QRadioButton('D')
  page3_radio1 = QRadioButton('E')
  page3_radio2 = QRadioButton('F')

  # 为3个标签页分别创建布局
  page1_vbox_layout = QVBoxLayout()
  page1_vbox_layout.addWidget(page1_radio1)
  page1_vbox_layout.addWidget(page1_radio2)
  tab1_widget.setLayout(page1_vbox_layout)

  page2_vbox_layout = QVBoxLayout()
  page2_vbox_layout.addWidget(page2_radio1)
  page2_vbox_layout.addWidget(page2_radio2)
  tab2_widget.setLayout(page2_vbox_layout)

  page3_vbox_layout = QVBoxLayout()
  page3_vbox_layout.addWidget(page3_radio1)
  page3_vbox_layout.addWidget(page3_radio2)
  tab3_widget.setLayout(page3_vbox_layout)

  # 创建QTabWidget部件
  my_tabwidget = MyTabWidget(top_widget)

  # 把容器添加到对应的选项卡之下
  my_tabwidget.addTab(tab1_widget, 'tabA')
  my_tabwidget.addTab(tab2_widget, 'tabB')
  my_tabwidget.addTab(tab3_widget, 'tabC')

  # 顶层窗口的布局
  top_vbox_layout = QVBoxLayout()
  top_vbox_layout.addWidget(remove_tab_btn)
  top_vbox_layout.addWidget(my_tabwidget)
  top_widget.setLayout(top_vbox_layout)

  # 关联信号和槽
  remove_tab_btn.clicked.connect(my_tabwidget.remove_tab_handler)
  # 使用QTabWidget就可以省略类似于下面的选项卡与容器的信号和槽的关联步骤
  # my_tabwidget.currentChanged.connect(my_stacked_layout.setCurrentIndex)

  top_widget.show()
  sys.exit(app.exec_())

程序运行效果如下:

20221120180115
20221120180145
20221120180205

点击removeTab按钮后:

20221120180230

七、如何通过Qt designer/Qt 设计师 设计多页面切换, 请移步另一篇博文

如何通过Qt designer/Qt 设计师 设计多页面切换的UI, 请移步另一篇博文:
《PyQt5利用Qt designer(QT设计师)使用tab widget和stacked widget实现多页面切换》

小手一抖,点个赞再走哦~~

  • 22
    点赞
  • 109
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
可以使用QTabWidget的setCurrentIndex函数来实现页面切换。首先,在Qt Designer中添加QTabWidget控件,并添加相应数量的QWidget页面(可以通过右键菜单添加)。然后,将QTabWidget和每个QWidget页面的objectName设置为不同的名称,以便在代码中引用它们。 接下来,在代码中使用QWidget的索引来设置当前活动页,例如: ```python # 导入所需的模块 from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget, QVBoxLayout, QPushButton, QTabWidget class MyWindow(QMainWindow): def __init__(self): super().__init__() # 创建 QTabWidget self.tab_widget = QTabWidget() # 创建 QWidget 页面 self.page1 = QWidget() self.page2 = QWidget() # 将 QWidget 页面添加到 QTabWidget self.tab_widget.addTab(self.page1, "Page 1") self.tab_widget.addTab(self.page2, "Page 2") # 创建垂直布局 layout = QVBoxLayout() # 创建按钮 button1 = QPushButton("Switch to Page 1") button2 = QPushButton("Switch to Page 2") # 将按钮添加到布局 layout.addWidget(button1) layout.addWidget(button2) # 将布局添加到 QWidget 页面 self.page1.setLayout(layout) self.page2.setLayout(layout) # 设置中央窗口为 QTabWidget self.setCentralWidget(self.tab_widget) # 连接按钮的信号和槽函数 button1.clicked.connect(self.switch_to_page1) button2.clicked.connect(self.switch_to_page2) # 定义切换到 Page 1 的槽函数 def switch_to_page1(self): self.tab_widget.setCurrentIndex(0) # 定义切换到 Page 2 的槽函数 def switch_to_page2(self): self.tab_widget.setCurrentIndex(1) if __name__ == '__main__': app = QApplication([]) window = MyWindow() window.show() app.exec_() ``` 在这个例子中,我们创建了一个QTabWidget,并添加了两个QWidget页面。每个QWidget页面包含一个垂直布局和一个按钮。在按钮的clicked信号和槽函数中,我们使用QTabWidget的setCurrentIndex函数来切换活动页面。 注意,每个QWidget页面都有自己的布局,因此我们需要使用两个不同的布局对象。如果两个QWidget页面使用相同的布局对象,则会发生未定义的行为。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

smart_cat

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

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

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

打赏作者

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

抵扣说明:

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

余额充值