4

我想要一个 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

我也试过 None 没有引号和 C++ 等效的“NULL”。但似乎两者都不起作用。我需要做什么才能完成这项工作?

4

3 回答 3

4

一个 hacky 解决方法是定义要发出的信号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
于 2019-09-05T17:58:45.640 回答
2

您不需要指定第二个选项 - 它将接受您的类类型的指针,该指针可能已经是 None 值:

valueChanged = pyqtSignal(MyClass)

# both will work as is
inst.valueChanged.emit(MyClass())
inst.valueChanged.emit(None)
于 2012-08-21T16:53:18.903 回答
2

您尝试的方法不起作用有几个原因。

首先,type参数pyqtSignal接受pythontype对象或给出C++ 对象名称的字符串(即Qt 类)。

因此,要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]),然后会收到不匹配的参数None

于 2012-08-21T17:49:19.267 回答