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()
如果我使用 bool
或 int
等原语但不使用对象,我的代码就可以正常工作。我看到了 '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
我遇到了一个找不到答案的问题。
我正在开发一个 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()
如果我使用 bool
或 int
等原语但不使用对象,我的代码就可以正常工作。我看到了 '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