我有一个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装饰器声明时,插槽参数的类型似乎无关紧要。

最佳答案

目前,Python解释器解释my_signal = pyqtSignal(...)时,尚不知道类名,首先创建了类主体,然后将其分配给名为MyClass的模块变量。因此,执行此操作的唯一方法是在定义类之后且在尝试访问信号对象之前。这意味着以下两个选项之一可能会起作用(这取决于pyqtSignal和QObject的工作方式,目前我无法尝试):


在模块级别,下课后:

class MyClass(QObject):
    def __init__(self, ...):
...

MyClass.my_signal = pyqtSignal(MyClass)

在init中,防止重新创建:

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

07-24 14:58