Python 将插槽连接到从类派生的所有对象的信号

Python 将插槽连接到从类派生的所有对象的信号,python,pyqt,pyqt5,Python,Pyqt,Pyqt5,我刚开始使用PyQt5,非常感谢您的帮助。我有一个小部件W,它响应来自某个C类的所有对象的信息。小部件W只能由C类的对象更新,在更新过程中,它必须知道是哪个特定对象触发了它 问题是C类对象可能会在整个程序过程中继续创建。是否可以将信号/插槽范例应用于此问题 到目前为止,我的想法是: 理想情况下,我会将W上的插槽连接到C上的类变量。然而,Qt不允许信号作为类变量 我可以使用集合对象CO,这样任何新对象C都必须通过该对象的接口创建。然后我在这个物体上定义了一个信号,它将连接到W上的一个插槽。然而,这

我刚开始使用PyQt5,非常感谢您的帮助。我有一个小部件W,它响应来自某个C类的所有对象的信息。小部件W只能由C类的对象更新,在更新过程中,它必须知道是哪个特定对象触发了它

问题是C类对象可能会在整个程序过程中继续创建。是否可以将信号/插槽范例应用于此问题

到目前为止,我的想法是:

  • 理想情况下,我会将W上的插槽连接到C上的类变量。然而,Qt不允许信号作为类变量
  • 我可以使用集合对象CO,这样任何新对象C都必须通过该对象的接口创建。然后我在这个物体上定义了一个信号,它将连接到W上的一个插槽。然而,这很难看,因为CO的存在只是为了解决这个问题
  • 我可以将signal/slot范例放在一起,而只需将W的回调(slot)添加到C上的类变量中。然后,每当创建新对象C时,它就已经有了对回调的引用

  • 一种可能的解决方案是使用元类:

    导入系统 从PyQt5导入QtCore、QtWidgets 类元(类型(QtCore.QObject),类型): 定义呼叫(cls,*参数,**千瓦): obj=super() 对于cls中的接收器。接收器: 目标信号连接(接收器) 返回obj C类(QtCore.QObject,元类=MetaC): signal=QtCore.pyqtSignal() 接收者=[] @类方法 def寄存器(cls,插槽): cls.receivers.append(插槽) C1(C)类: def测试(自我): self.signal.emit() C2(C1)类: 通过 类小部件(qtwidts.QWidget): def uuu init uuu(self,parent=None): super()。\uuuu init\uuuu(父级) C.注册(self.foo) def foo(self): 打印(“foo”) 如果名称=“\uuuuu main\uuuuuuuu”: app=qtwidts.QApplication(sys.argv) w=Widget() w、 show() c1,c2=c1(),c2() QtCore.QTimer.singleShot(1000,c1.测试) QtCore.QTimer.singleShot(5*1000,c2.测试) QtCore.QTimer.singleShot(6*1000,QtCore.QCoreApplication.quit) sys.exit(app.exec_())
    一种可能的解决方案是使用元类:

    导入系统 从PyQt5导入QtCore、QtWidgets 类元(类型(QtCore.QObject),类型): 定义呼叫(cls,*参数,**千瓦): obj=super() 对于cls中的接收器。接收器: 目标信号连接(接收器) 返回obj C类(QtCore.QObject,元类=MetaC): signal=QtCore.pyqtSignal() 接收者=[] @类方法 def寄存器(cls,插槽): cls.receivers.append(插槽) C1(C)类: def测试(自我): self.signal.emit() C2(C1)类: 通过 类小部件(qtwidts.QWidget): def uuu init uuu(self,parent=None): super()。\uuuu init\uuuu(父级) C.注册(self.foo) def foo(self): 打印(“foo”) 如果名称=“\uuuuu main\uuuuuuuu”: app=qtwidts.QApplication(sys.argv) w=Widget() w、 show() c1,c2=c1(),c2() QtCore.QTimer.singleShot(1000,c1.测试) QtCore.QTimer.singleShot(5*1000,c2.测试) QtCore.QTimer.singleShot(6*1000,QtCore.QCoreApplication.quit) sys.exit(app.exec_())