pyqt signal以对象实例或None发出

时间:2012-08-21 07:48:52

标签: python pyqt pyside

我想有一个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”。但似乎都不起作用。为了使这项工作我需要做什么?

3 个答案:

答案 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。由于NoneMyClass都继承自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