当尝试在工作网络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())
但是,这有点混乱,我宁愿在不了解其必要性的情况下也不使用变通方法。
答案 0 :(得分:0)
在其他人也一样犯同样的愚蠢错误而无法发现错误时留在这里
在我的复制示例中,错误非常明显并且相对容易发现。在QtCore.pyqtSlot()(a.a)
行中,我错误地包装了 bound 实例方法,其中pyqt仅允许在方法/函数定义时使用pyqtSlot
。
在定义方法时,仅使用QtCore.pyqtSlot()
作为修饰符是一种解决方案,我想避免。