我想有一个pyqt信号,它可以用python“object”子类参数或None发出。例如,我可以这样做:
valueChanged = pyqtSignal([MyClass], ['QString'])
但不是这样:
valueChanged = pyqtSignal([MyClass], ['None'])
TypeError: C++ type 'None' is not supported as a pyqtSignal() type argument type
或者这个:
valueChanged = pyqtSignal([MyClass], [])
TypeError: signal valueChanged[MyObject] has 1 argument(s) but 0 provided
我也尝试过没有引号和c ++等效的“NULL”。但似乎都不起作用。为了使这项工作我需要做什么?
答案 0 :(得分:2)
您不需要指定第二个选项 - 它将接受您的类类型的指针,该类型可以是None值:
valueChanged = pyqtSignal(MyClass)
# both will work as is
inst.valueChanged.emit(MyClass())
inst.valueChanged.emit(None)
答案 1 :(得分:2)
有几个原因可以解释为什么你的尝试不起作用。
首先,type
的{{1}}参数接受python pyqtSignal
对象或给出C ++对象名称的字符串(即Qt类)。
因此,要使用type
作为参数类型,您必须传递None
而不是字符串type(None)
。
其次,"None"
是特殊的,允许在不明确选择签名的情况下使用信号的默认重载。
所以如果你创建了这样的信号:
None
然后尝试发出这样的信号:
valueChanged = QtCore.pyqtSignal([MyClass], [type(None)])
你会得到这样的错误:
self.valueChanged[type(None)].emit(None)
因此,使用TypeError: Window.valueChanged[MyClass].emit():
argument 1 has unexpected type 'NoneType'
实际上会导致默认签名(valueChanged[type(None)]
)被选中,然后会收到[MyClass]
的不匹配参数。
答案 2 :(得分:2)
对此的一种变通办法是定义您的信号发射object
。由于None
和MyClass
都继承自object
,因此可以正常工作。这不需要在插槽中进行浇铸。
在PyQt5 5.11.3和Python 3.5.6中工作
信号
valueChanged = QtCore.pyqtSignal(object)
valueChanged.emit(MyClass())
valueChanged.emit(None)
广告位
valueChanged.connect(slot)
def slot(my_class_instance):
if my_class_instance:
my_class_instance.some_method()
else:
# my_class_instance is None