如何设置以 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 的工作方式,我现在无法尝试):
在模块级别,在 class 之后:
class MyClass(QObject):
def __init__(self, ...):
...
MyClass.my_signal = pyqtSignal(MyClass)
在init中,防范re-creation:
class MyClass(QObject):
def __init__(self, ...):
if not hasattr(self, 'my_signal'):
MyClass.my_signal = pyqtSignal(MyClass)
我有一个 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 的工作方式,我现在无法尝试):
在模块级别,在 class 之后:
class MyClass(QObject): def __init__(self, ...): ... MyClass.my_signal = pyqtSignal(MyClass)
在init中,防范re-creation:
class MyClass(QObject): def __init__(self, ...): if not hasattr(self, 'my_signal'): MyClass.my_signal = pyqtSignal(MyClass)