PyQt5 笔记7 -- 多个类共享信号

版权声明: https://blog.csdn.net/Wang_Jiankun/article/details/83624699

PyQt5 笔记7 – 多个类共享信号


应用:对话框发送信号给主窗口,控制主窗口的控件
在这里插入图片描述
在这里插入图片描述


1、信号传递


  • 主窗口类中自定义信号并在构造函数中绑定槽函数
  • 实例化对话框类时把主窗口的对象传过去
  • 对话框中自定义信号并在构造函数中绑定槽函数为主窗口类中的信号触发函数
  • 当要执行主窗口类中自定义信号绑定槽函数时,只要触发当前类中的自定义信号,就可以往上传递信号了
  • 可以嵌套多层
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QDialog, QPushButton
from PyQt5.QtCore import Qt, pyqtSignal


class MainWindow(QMainWindow):
    """
    主窗口类
    """
    my_signal = pyqtSignal()

    def __init__(self, *args):
        super(MainWindow, self).__init__(*args)

        # 设置主窗口的标题及大小
        self.setWindowTitle('主窗口')
        self.resize(400, 300)

        # 创建按钮
        self.btn = QPushButton(self)
        self.btn.setText('弹出对话框')
        self.btn.clicked.connect(self.show_dialog)

        # 自定义信号绑定
        self.my_signal.connect(self.test)

        # 创建对话框对象
        self.dialog = Dialog(self)

    def show_dialog(self):
        self.dialog.show()
        self.dialog.exec()

    def test(self):
        self.btn.setText('我改变了')


class Dialog(QDialog):
    """
    对话框类
    """
    my_signal = pyqtSignal()

    def __init__(self, parent, *args):
        super(Dialog, self).__init__(*args)

        # 设置对话框的标题及大小
        self.setWindowTitle('对话框')
        self.resize(200, 200)
        self.setWindowModality(Qt.ApplicationModal)
        self.btn = QPushButton(self)
        self.btn.setText('改变主窗口按钮的名称')
        self.btn.clicked.connect(self.my_signal.emit)

        # 自定义信号绑定
        self.my_signal.connect(parent.my_signal.emit)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    demo = MainWindow()
    demo.show()
    sys.exit(app.exec())

2、单例模式


  • 新建一个信号类成单例模式(该类只能有一个对象),类中自定义信号和一个触发信号的方法
  • 在主窗口类中获得信号类的对象的自定义信号,并绑定槽函数
  • 在对话框类中调用信号类对象中的触发信号的方法即可触发信号
  • 可以有多个对话框类共用信号类的触发信号方法
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QDialog, QPushButton
from PyQt5.QtCore import QObject, Qt, pyqtSignal

class MySignal(QObject):
    """
    信号类
    """
    instance = None
    signal = pyqtSignal()

    @classmethod
    def my_signal(cls):
        if cls.instance:
            return cls.instance
        else:
            obj = cls()
            cls.instance = obj
            return cls.instance

    def em(self):
        self.signal.emit()

class MainWindow(QMainWindow):
    """
    主窗口类
    """
    Signal = MySignal.my_signal().signal

    def __init__(self, *args):
        super(MainWindow, self).__init__(*args)

        # 设置主窗口的标题及大小
        self.setWindowTitle('主窗口')
        self.resize(400, 300)

        # 创建按钮
        self.btn = QPushButton(self)
        self.btn.setText('弹出对话框')
        self.btn.move(50, 50)
        self.btn.clicked.connect(self.show_dialog)

        # 自定义信号绑定
        self.Signal.connect(self.test)

        self.dialog = Dialog()

    def show_dialog(self):
        self.dialog.show()
        self.dialog.exec()

    def test(self):
        self.btn.setText('我改变了')

class Dialog(QDialog):
    """
    对话框类
    """
    def __init__(self, *args):
        super(Dialog, self).__init__(*args)

        # 设置对话框的标题及大小
        self.setWindowTitle('对话框')
        self.resize(200, 200)
        self.setWindowModality(Qt.ApplicationModal)
        self.btn = QPushButton(self)
        self.btn.setText('改变主窗口按钮的名称')
        self.btn.move(50, 50)
        self.btn.clicked.connect(MySignal.my_signal().em)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    demo = MainWindow()
    demo.show()
    sys.exit(app.exec())

猜你喜欢

转载自blog.csdn.net/Wang_Jiankun/article/details/83624699