Ho una GUI PySide (Qt) che genera più thread. A volte i thread devono aggiornare la GUI. Ho risolto questo nel modo seguente:PySide: modo più semplice di aggiornare la GUI da un altro thread
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()
# ...
C'è un modo più semplice? Creare i segnali, i gestori e collegarli richiede poche righe di codice.
Perché non stai usando 'QThread'? – Avaris
Se è più semplice con un 'QThread', vorrei prendere in considerazione l'utilizzo di uno. Il problema è che il codice esistente tende spesso a usare 'threading.Thread'. – Petter
È meglio, poiché 'QThread' supporta i segnali. Non avrai bisogno della tua classe 'Signaller'. Ma in fondo, la tua strada è la via. Avete bisogno di segnali e slot per comunicare tra thread e GUI. – Avaris