我有一个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)