猿问

pyqt为实例方法声明QtCore.pyslot

尝试在工作人员网络之间设置新的插槽和信号,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())

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


慕莱坞森
浏览 159回答 1
1回答

饮歌长啸

如果有人犯同样的愚蠢错误而无法发现错误,例如我自己,请留在这里在我的复制示例中,错误非常明显,并且相对容易发现。在网上,QtCore.pyqtSlot()(a.a)我错误地包装了绑定实例方法,其中pyqt仅允许pyqtSlot在方法/函数定义时使用。QtCore.pyqtSlot()我想避免的是在定义方法时简单地用作装饰器是一种解决方案。
随时随地看视频慕课网APP

相关分类

Python
我要回答