我有一个使用 PySide (Qt) 实现的 GUI,它会产生多个线程。这些线程有时需要更新 GUI。我是通过以下方式解决了这个问题:
class Signaller(QtCore.QObject) :
my_signal = QtCore.Signal(QListWidgetItem, QIcon)
signaller = Signaller()
class MyThread(threading.Thread):
def __init__(self):
super(IconThread, self).__init__()
# ...
def run(self) :
# ...
# Need to update the GUI
signaller.my_signal.emit(self.item, icon)
#
# MAIN WINDOW
#
class Main(QtGui.QMainWindow):
def __init__(self):
QtGui.QMainWindow.__init__(self)
# ...
# Connect signals
signaller.my_signal.connect(self.my_handler)
@QtCore.Slot(QListWidgetItem, QIcon)
def my_handler(self, item, icon):
item.setIcon(icon)
def do_something(self, address):
# ...
# Start new thread
my_thread = MyThread(newItem)
my_thread.start()
# ...
有更简单的方法吗?创建信号、处理程序并连接它们需要几行代码。
QThread
呢? - AvarisQThread
更容易,我会考虑使用它。问题在于现有的代码往往使用threading.Thread
。 - PetterQThread
,因为它支持信号。这样你就不需要自己的Signaller
类了。但基本上,你的方法也是可以的。你需要使用信号和槽来在线程和GUI之间进行通信。 - Avaris