0
点赞
收藏
分享

微信扫一扫

pyqt5多窗口路由组件


路由原理:信号与槽

组件类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_())

举报

相关推荐

0 条评论