Ich habe eine PySide (Qt) GUI, die mehrere Threads hervorbringt. Die Threads müssen manchmal die GUI aktualisieren. Ich habe das auf folgende Weise gelöst:PySide: Einfachere Möglichkeit, GUI von einem anderen Thread zu aktualisieren
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()
# ...
Gibt es einen einfacheren Weg? Die Erstellung der Signale, Handler und deren Verbindung erfordert ein paar Zeilen Code.
Warum verwenden Sie 'QThread' nicht? – Avaris
Wenn es mit einem 'QThread' einfacher ist, würde ich einen verwenden. Das Problem besteht darin, dass der vorhandene Code häufig dazu tendiert, 'threading.Thread' zu verwenden. – Petter
Es ist besser, da 'QThread' Signale unterstützt. Sie brauchen Ihre 'Signaller' Klasse nicht. Aber grundsätzlich ist dein Weg der richtige Weg. Sie benötigen Signale und Slots, um zwischen Threads und GUI zu kommunizieren. – Avaris