PyQt5多页面跳转
Contents
::: 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()