PyQt5信号和槽中的“QObject没有属性”错误。

9

我一直在尝试找到一种方法,可以在Python线程之外的主线程中更新GUI线程。 PyQt5文档 在sourceforge上有很好的说明。但是我仍然无法使事情正常工作。

有没有一个好的方法来解释交互式会话的以下输出?难道不能调用这些对象的发射方法吗?

>>> from PyQt5.QtCore import QObject, pyqtSignal
>>> obj = QObject()
>>> sig = pyqtSignal()
>>> obj.emit(sig)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'QObject' object has no attribute 'emit'

并且

>>> obj.sig.emit()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'QObject' object has no attribute 'sig'

并且

>>> obj.sig = pyqtSignal()
>>> obj.sig.emit()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'PyQt5.QtCore.pyqtSignal' object has no attribute 'emit'

1
仅有 绑定 信号才有 emit 方法。(obj.sig = pyqtSignal() 仍是未绑定的信号) - 在哪个模块中可以找到 emit 方法? - mata
@mata:是的,我是从sourceforge的PyQt5文档中获取这些示例的。正如您所指出的,emit方法是用于绑定信号的,即它是从继承自QObject的类的成员中派生出来的。我没有意识到我在上面粘贴的交互式会话中没有这样做。 - ADB
@mata:只是好奇,像上面第三个例子中的 obj.sig = pyqtSignal() 的实用性是什么? - ADB
obj.sig = pyqtSignal() 将未绑定的信号分配给对象实例-这并没有什么意义。信号需要在类上声明,当在实例上查找时,它们会被绑定-在 PyQt 中它们是描述符,而且只有在类上声明时才能起作用。 - mata
谢谢,这将对我正在进行的项目有所帮助。感谢您抽出时间来回答我的问题。 - ADB
1个回答

32

以下单词和代码在PyQt5文档中。

新的信号应该仅在QObject的子类中定义。它们必须是类定义的一部分,在类定义后不能作为类属性动态添加。

from PyQt5.QtCore import QObject, pyqtSignal

class Foo(QObject):

    # Define a new signal called 'trigger' that has no arguments.
    trigger = pyqtSignal()

    def connect_and_emit_trigger(self):
        # Connect the trigger signal to a slot.
        self.trigger.connect(self.handle_trigger)

        # Emit the signal.
        self.trigger.emit()

    def handle_trigger(self):
        # Show that the slot has been called.

        print "trigger signal received"

哇,一年多过去了!答案被接受了(尽管问题在上面的评论中已经得到了解决)。 - ADB
1
请注意,如果您在 QObject 的子类中实现了 __init__,您还必须调用超类的 __init__ - mike rodent

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接