Das Thema muss sitzen, also versuche ich das etwas zu vertiefen. Gestern habe ich viel Stunden damit verbracht, mein Restic UI auf das waitingspinnerwidget umzubauen. Bis auf eine Funktion, die heute noch dran kommt, habe ich alles hinbekommen Aber, wie immer habe ich danach Fragen. Ok, fangen wir mal an.
@pyqtSlot(str)
def onFinished(self, i):
#print("Base caught finished, {}".format(i))
print("Worker end", i)
Wenn wir uns den Code anschauen, kommt die Frage auf, was macht @pyqtSlot(str) ? Ich probiere viel aus, also hatte ich das in meinem Code auskommentiert und mich gewundert, warum das immer noch funktioniert!? Ok, also Dokumentation lesen.
https://www.riverbankcomputing.com/static/Docs/PyQt5/signals_slots.html#the-pyqtslot-decorator
Connecting a signal to a decorated Python method also has the advantage of reducing the amount of memory used and is slightly faster.
Das klärt meine Frage aber immer noch nicht komplett. Auf stackoverflow.com, das folgende gefunden.
For your case consider it as a good practice - denoting a method as a slot for some signal.
https://stackoverflow.com/questions/45841843/function-of-pyqtslot
Also muss ich mir jetzt merken, das es weniger Speicher verbraucht und etwas schneller ist. Gut, und es ordentlicher Programmierstil(?), wenn ich die Funktionen als abhängig von Signalen kennzeichne!? Ich denke, so passt es ganz gut.
Sehr gute Anleitungen zum Thema findet man auch immer wieder auf realpython.com. Hier z.B. zum Thema QThread. Anhand des Beispieles habe ich meinen ersten QThread heute folgendermaßen dokumentiert.
"First Thread with documentation"
# Worker for restic_stats
# Create a QThread object
self.thread = QThread()
# Create a worker object
self.worker1 = Worker()
# Move worker to the thread
self.worker1.moveToThread(self.thread)
# Connect signals and slots
self.thread.started.connect(self.worker1.run)
self.worker1.stats_finished[str].connect(self.restic_stats_finished)
self.worker1.stats_error[str].connect(self.restic_stats_error)
"First thread end"
Dann stand ich sehr schnell vor dem Problem, was mache ich bei der nächsten Funktion, die einen QThread braucht?
# Worker for restic_backup
self.thread2 = QThread()
self.worker2 = Worker2()
self.worker2.moveToThread(self.thread2)
self.thread2.started.connect(self.worker2.run)
self.worker2.backup_finished[str].connect(self.restic_backup_finished)
self.worker2.backup_error[str].connect(self.restic_backup_error)
Ok, das war jetzt nicht so wirklich schwierig.