【问题标题】:'PySide2.QtCore.Signal' object has no attribute 'connect''PySide2.QtCore.Signal' 对象没有属性 'connect'
【发布时间】:2018-10-30 01:23:49
【问题描述】:

我正在尝试为我的 PySide2 应用程序的 QRunnable 对象创建自定义信号。所有示例都导致我通过以下方式创建信号:

class Foo1(QtCore.QObject):

    def __init__():
        super().__init__()
        self.thread = Foo2()
        self.thread.signal.connect(foo)

    def foo():
        # do something


class Foo2(QtCore.QRunnable):

    signal = QtCore.Signal()

但是,我在self.thread.signal.connect(foo) 上收到以下错误:

'PySide.QtCore.Signal' object has no attribute 'connect'

我应该如何为 QRunnable 对象实现自定义信号?

【问题讨论】:

    标签: python pyside2


    【解决方案1】:

    QRunnable 不是 QObject,因此它不能有信号,因此可能的解决方案是创建一个提供信号的类:

    class FooConnection(QtCore.QObject):
        foosignal = QtCore.Signal(foo_type)
    
    class Foo2(QtCore.QRunnable):
        def __init__(self):
            super(Foo2, self).__init__() 
            self.obj_connection = FooConnection()
    
        def run(self):
            # do something
            foo_value = some_operation()
            self.obj_connection.foosignal.emit(foo_value)
    
    class Foo1(QtCore.QObject):
        def __init__():
            super().__init__()
            self.pool = Foo2()
            self.pool.obj_connection.foosignal.connect(foo)
            QtCore.QThreadPool.globalInstance().start(self.pool)
    
        @QtCore.Slot(foo_type)
        def foo(self, foo_value):
            # do something
    

    【讨论】:

    • 我已经阅读了关于类是否必须从 QObject 继承来实现 QtCore.Signal 的混合文档。一份文档表明确指出 QtCore.Signal 的存在是为了允许为未从 QObject 继承的类创建信号(不幸的是,我再也找不到该文档表了)。你确定从 QObject 继承是必要的吗?
    • @MatthewSpydell 信号只能在继承自 QObject 的类中创建,例如小部件是 QObjects,在 c++ 和 python 中使用 Qt,并且 QObject 的条件在两者中都是强制性的。如果您已经阅读了其他说明的教程,我建议您不再阅读它。例如,the docs 表示:注意:信号只能在继承自 QObject 的类中定义。这样信号信息就被添加到类 QMetaObject 结构中了。
    • 这是官方文档wiki.qt.io/Qt_for_Python_Signals_and_Slots 上的一些示例,最后一个使用 QThread 演示了非常相似的东西。
    • QRunnable is not a QObject 成就了我的一天。谢谢!我虽然每个以Q 开头的课程都是QObject
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-16
    • 2016-08-28
    • 2016-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多