Contents

PyQt5多页面跳转

::: tip Qt designer 和 代码进行 Qt 开发实现页面跳转不同,本文记录 designer 开发 :::

PyQt5 多页面跳转

借助一个 Controller 控制器来实现,大体思路如下

# 利用一个控制器来控制页面的跳转
class Controller:
    def __init__(self):
        pass
    def show_A(self):
    	# 创建 A 窗口对象并显示
    	# 关闭其余窗口对象
    def show_B(self):
    	# 创建 B 窗口对象并显示
    	# 关闭其余窗口对象
    def show_C(self):
    	# 创建 C 窗口对象并显示
    	# 关闭其余窗口对象

情景:

  • 用 Qt designer 设计三个页面:hello.py、login.py、operate.py
  • hello.py 中有一个 Id 为 loginBuuton 的按钮,用于跳转到 login.py 窗口
  • hello.py 中还有一个 Id 为 operateButton 的按钮,用于跳转到 operate.py 窗口

代码编写

导入需要的模块:系统模块 和 利用designer设计的页面

import sys
from PyQt5 import QtCore, QtWidgets, QtCore

# 导入 Qt designer 设计的页面
from hello import Ui_MainWindow as Hello_Ui 
from login import Ui_MainWindow as Login_Ui
from operate import Ui_MainWindow as Operate_Ui

写页面对应的窗口类,实现 一个页面往其他页面的跳转;

实现跳转的逻辑主要都在 HelloWindow 类中,其他窗口类仅仅做了初始化:

# 主窗口
class HelloWindow(QtWidgets.QMainWindow, Hello_Ui):
    switch_window1 = QtCore.pyqtSignal() # 跳转信号
    switch_window2 = QtCore.pyqtSignal() # 跳转信号

    def __init__(self):
        super(HelloWindow, self).__init__()
        self.setupUi(self)
        self.queryButton.clicked.connect(self.goOperate)
        self.manageButton.clicked.connect(self.goLogin)

    def goLogin(self):
        self.switch_window1.emit()

    def goOperate(self):
        self.switch_window2.emit()

# 登录窗口
class LoginWindow(QtWidgets.QMainWindow, Login_Ui):
    def __init__(self):
        super(LoginWindow, self).__init__()
        self.setupUi(self)

# 操作窗口
class OperateWindow(QtWidgets.QMainWindow, Operate_Ui):
    def __init__(self):
        super(OperateWindow, self).__init__()
        self.setupUi(self)

控制器用来控制页面的跳转:

# 利用一个控制器来控制页面的跳转
class Controller:
    def __init__(self):
        pass

    # 跳转到 hello 窗口
    def show_hello(self):
        self.hello = HelloWindow()
        self.hello.switch_window1.connect(self.show_login)
        self.hello.switch_window2.connect(self.show_operate)
        self.hello.show()

    # 跳转到 login 窗口, 注意关闭原页面
    def show_login(self):
        self.login = LoginWindow()
        self.hello.close()
        self.login.show()
        
    # 跳转到 operate 窗口, 注意关闭原页面
    def show_operate(self):
        self.operate = OperateWindow()
        self.hello.close()
        self.operate.show()

启动项目:

def main():
    app = QtWidgets.QApplication(sys.argv)
    controller = Controller() # 控制器实例
    controller.show_hello() # 默认展示的是 hello 页面
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()