【问题标题】:PyQt5 Signals and Slots 'QObject has no attribute' errorPyQt5 信号和插槽“QObject 没有属性”错误
【发布时间】:2013-07-08 20:13:11
【问题描述】:

我一直在尝试找到一种方法来从 main 之外的 Python 线程更新 GUI 线程。 sourceforge 上的PyQt5 docs 对如何执行此操作有很好的说明。但我仍然无法让事情正常进行。

有没有一种很好的方法来解释交互式会话的以下输出?难道不应该有办法在这些对象上调用 emit 方法吗?

>>> 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'

【问题讨论】:

  • 与此处相同:PyQt5 in what module is the emit method found? - 只有 bound 信号具有 emit 方法。 (obj.sig = pyqtSignal() 仍然是一个未绑定的信号)
  • @mata:是的,我从 sourceforge 的 PyQt5 文档中获取了这些示例。正如您pointed out 一样,emit 方法用于绑定信号,即它是从QObject 继承的类的成员。我没有意识到我在上面粘贴的交互式会话中没有这样做。
  • @mata:很好奇,像上面第三个例子中的 obj.sig = pyqtSignal() 有什么用处?
  • obj.sig = pyqtSignal() 将未绑定的信号分配给对象实例 - 这没有多大意义。信号需要在类上声明,然后在实例上查找它们时绑定它们 - 在 PyQt 中它们是 descriptors 并且描述符仅在类上声明时才起作用。
  • 谢谢,这将对我正在进行的项目有所帮助。感谢您花时间回答我的问题。

标签: user-interface pyqt qt-signals pyqt5


【解决方案1】:

以下文字和代码在PyQt5 docs中。

新信号应该只在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"

【讨论】:

  • 哇,一年多过去了!已接受答案(即使问题已在上面的 cmets 中清除)。
  • 另外请记住,如果您在 QObject 的子类上实现 __init__,您还必须调用超类 __init__
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-20
  • 1970-01-01
  • 2013-10-08
  • 2019-04-15
  • 1970-01-01
  • 2012-11-15
相关资源
最近更新 更多