PySide2 信号未在具有对象的线程之间捕获

PySide2 signal not catched between threads with objects

我遇到了一个找不到答案的问题。

我正在开发一个 GUI 应用程序,它是在 Python 及其 UI 库中开发的:PySide2(Python 的 Qt 包装器)

我有一个繁重的计算函数,我想放在另一个线程上,以免冻结我的 UI。 Ui 应该显示 "Loading" 并且当函数结束时,从它接收它的结果并用它更新 UI。

我尝试了很多不同的代码,很多例子对其他人有效但对我无效,是 PySide2 错误吗? (例如,这几乎是我想要做的:Updating GUI elements in MultiThreaded PyQT

我的代码是:

class OtherThread(QThread):

    def __init__(self):
        QThread.__init__(self)

    def run(self):
        print 'Running......'
        self.emit(SIGNAL("over(object)"), [(1,2,3), (2,3,4)])

@Slot(object)
def printHey( obj):
    print 'Hey, I\'ve got an object ',
    print obj

thr = OtherThread()
self.connect(thr,SIGNAL("over(object)"),printHey)
thr.start()

如果我使用 boolint 等原语但不使用对象,我的代码就可以正常工作。我看到了 'Running....' 但没有看到其他的。

希望有人能赐教

您不能在 class 实例上动态定义信号。它们必须定义为 class 属性。你应该使用 new-style signals and slot syntax.

class OtherThread(QThread):
    over = QtCore.Signal(object)

    def run(self):
        ...
        self.over.emit([(1,2,3), (2,3,4)])


class MyApp(QtCore.QObject)

    def __init__(self):
        super(MyApp, self).__init__()
        self.thread = OtherThread(self)
        self.thread.over.connect(self.on_over)
        self.thread.start()

    @QtCore.Slot(object)
    def on_over(self, value):
        print 'Thread Value', value