"PySide2.QtCore.Signal"对象没有"connect"属性。

4

我尝试为我的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对象实现自定义信号?

1个回答

9

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吗? - Matthew Spydell
@MatthewSpydell 信号只能在继承自QObject的类中创建,例如小部件是QObjects,在c++和python中使用Qt,并且在两者中都必须满足QObject的条件。如果您阅读了一个说法相反的教程,我建议您不再阅读它。例如,文档指出:注意:信号应仅在继承自QObject的类中定义。这样,信号信息将添加到类QMetaObject结构中。 - eyllanesc
有一些示例在官方文档https://wiki.qt.io/Qt_for_Python_Signals_and_Slots上。最后一个示例使用QThread演示了非常相似的内容。 - Zompa
QRunnable is not a QObject made my day. Thank you! I though every class that starts with Q is a QObject - RedEyed

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