使用对象实例或非对象实例发出的pyqt信号

2024-09-30 07:31:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我想要一个pyqt信号,它可以用python“object”子类参数发出,也可以不发出。例如,我可以这样做:

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++等价的“空”。但两种方法都不管用。我需要做什么才能让这件事成功?


Tags: none参数object信号istypemyclassnot
3条回答

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

valueChanged = pyqtSignal(MyClass)

# both will work as is
inst.valueChanged.emit(MyClass())
inst.valueChanged.emit(None)

一个棘手的解决方法是定义要发出的信号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

你所尝试的没有成功有几个原因。

首先,^ {< CD1>}参数^ ^ {CD2>}接受Python ^ {< CD1>}对象,或接受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

相关问题 更多 >

    热门问题