pyqt为实例方法声明QtCore.pyslot

时间:2018-08-14 23:07:00

标签: python pyqt

当尝试在工作网络QRunnable之间建立新的插槽并发出信号并通过回调提交代码(以处理网络响应)时,我得到了以下代码行:

exception_callback = QtCore.pyqtSlot('PyQt_PyObject', str)(exception_callback)

其中exception_callback是某个类实例的绑定成员函数。但是,上述行失败并显示以下错误:

AttributeError: 'instancemethod' object has no attribute '__pyqtSignature__'

我想念什么?

编辑:

简单复制:

class A(QtCore.QObject):
  def a(self):
    print("Called")

a=A()
QtCore.pyqtSlot()(a.a)

会引发以下异常:

AttributeError: 'instancemethod' object has no attribute '__pyqtSignature__'

我发现一种解决方法是,将成员函数包装起来并在成员函数周围使用闭包是可行的:

QtCore.pyqtSlot()(lambda : a.a())

但是,这有点混乱,我宁愿在不了解其必要性的情况下也不使用变通方法。

1 个答案:

答案 0 :(得分:0)

在其他人也一样犯同样的愚蠢错误而无法发现错误时留在这里

在我的复制示例中,错误非常明显并且相对容易发现。在QtCore.pyqtSlot()(a.a)行中,我错误地包装了 bound 实例方法,其中pyqt仅允许在方法/函数定义时使用pyqtSlot

在定义方法时,仅使用QtCore.pyqtSlot()作为修饰符是一种解决方案,我想避免。