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

How to set the type of a pyqtSignal (variable of class X) that takes a X instance as argument

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

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

    (...)

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

我知道 pyqtSignal(object) 会起作用,但我想知道在 class 变量级别是否有某种 __class__

另一个问题:pyqtSignal(MyClass)pyqtSignal(QWidget)(父class)或pyqtSignal(object)之间有区别吗?表现?我问这个问题是因为当我们用 @pyqtSlot 装饰器声明它们时,插槽参数的类型似乎并不重要。

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

  1. 在模块级别,在 class 之后:

    class MyClass(QObject):
        def __init__(self, ...):
    ...
    
    MyClass.my_signal = pyqtSignal(MyClass)
    
  2. 在init中,防范re-creation:

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