路由原理:信号与槽
组件类QRoute.py
from PyQt5.QtCore import pyqtSignal
'''窗口路由组件'''
class QRoute(object):
# 信号构建器:每个参与路由的窗口类都必须继承该类。
class RouteSignal(object):
signal = pyqtSignal(type, tuple)
def __init__(self, home, data) -> None:
super(QRoute, self).__init__()
self.handle(home, data)
# 路由处理器
def handle(self, clazz, data) -> None:
clazz_instance = clazz(data)
clazz_instance.show()
clazz_instance.signal.connect(lambda to_clazz, data: (clazz_instance.close(), self.handle(to_clazz, data)))
使用示例:
import sys
from PyQt5.QtWidgets import QWidget, QPushButton, QApplication
from QRoute import QRoute
class LoginWindow(QWidget, QRoute.RouteSignal):
# 每个参与路由的窗口类,初始化必须引入data,这个data作为窗口之间传参的桥梁
def __init__(self, data):
print(data)
super(LoginWindow, self).__init__()
self.init_ui()
def init_ui(self) -> None:
self.setGeometry(300, 300, 300, 300)
self.setWindowTitle('登錄界面')
button = QPushButton('去注册', self)
# 发出窗口跳转信号,参数:窗口类的引用和需要传递的数据
button.clicked.connect(lambda meta: self.signal.emit(RegisterWindow, (meta, '传递注册参数')))
class RegisterWindow(QWidget, QRoute.RouteSignal):
# 每个参与路由的窗口类,初始化必须引入data,这个data作为窗口之间传参的桥梁
def __init__(self, data):
print(data)
super(RegisterWindow, self).__init__()
self.init_ui()
def init_ui(self) -> None:
self.setWindowTitle('注冊界面')
self.setGeometry(300, 300, 300, 300)
button = QPushButton('去登录', self)
# 发出窗口跳转信号,参数:窗口类的引用和需要传递的数据
button.clicked.connect(lambda meta: self.signal.emit(LoginWindow, (meta, {'name': 'lily'})))
if __name__ == '__main__':
app = QApplication(sys.argv)
window = QRoute(LoginWindow, None)
sys.exit(app.exec_())