如何设置以X实例作为参数的pyqtSignal(类X的变量)的类型

时间:2016-01-01 21:25:27

标签: python pyqt signals pyqt5

我有一个pyqtSignal作为类变量,我希望它的参数是该类的一个实例。在创建信号时如何声明参数的类型?

class MyClass(QWidget):
    my_signal = pyqtSignal(?)

    (...)

    def emit_signal(self):
        self.my_signal.emit(self)

我知道pyqtSignal(object)可行,但我想知道在类变量级别是否存在某种__class__

另一个问题:pyqtSignal(MyClass)pyqtSignal(QWidget)(父类)或pyqtSignal(object)之间存在差异吗?性能?我问这个问题是因为当我们用@pyqtSlot装饰器声明时,插槽参数的类型似乎并不重要。

1 个答案:

答案 0 :(得分:1)

当Python解释器解释my_signal = pyqtSignal(...)时,类名称尚不为人所知,首先创建类主体,然后将其分配给名为MyClass的模块变量。因此,唯一的方法是在定义类之后,以及在任何尝试访问信号对象之前。这意味着可能的以下两个选项之一(它取决于pyqtSignal和QObject的工作原理,此时我无法尝试):

  1. 在模块级别,课后:

    class MyClass(QObject):
        def __init__(self, ...):
    ...
    
    MyClass.my_signal = pyqtSignal(MyClass)
    
  2. 在init中,防止重新创建:

    class MyClass(QObject):
        def __init__(self, ...):
            if not hasattr(self, 'my_signal'):
                MyClass.my_signal = pyqtSignal(MyClass)