Funktionen aus Thread starten (QtWidget Methode)

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Tinker232
User
Beiträge: 50
Registriert: Mittwoch 25. Juli 2018, 13:45

Mittwoch 31. Oktober 2018, 10:00

Hallo zusammen,

ich möchte gerne eine Methode starten, die optische Merkmale auf meiner grafischen Oberfläche setzt, wie z.B. Progress_Bar.setValue(0)

Hintergrund ist:
Ich habe einen Thread der Daten schreibt. Während dieser Zeit sind diverse Elemente auf meinem GUI gesperrt, wie z.B. ein Slider.
Drücke ich nun den Stop_Button wird innerhalb des Threads die Schleife beendet und die restlichen Daten werden geschrieben, bis meine Queue leer ist.
Erst dann sollen die Elemente auf dem GUI wieder freigegeben werden bzw. die Progress_Bar auf 0 gesetzt werden.
Um meine Elemente erst dann freizugeben wenn der Thread auch beendet ist, wollte ich die Funktion "setze_style_gui" direkt aus dem Thread starten, bevor er sich beendet. Also als letzte Amtshandlung des Threads sozusagen.
Praktisch gesehen funktioniert das auch in den meisten Fällen, jedoch habe ich gelesen, dass Veränderungen von QWidgets aus einem Thread nicht threadsafe sind und massive Probleme verursachen können.
Nach etlichen Versuchen hatte ich dann auch einen kompletten Absturz mit der Meldung:

Code: Alles auswählen

QWidget::repaint: Recursive repaint detected.
Jetzt ist meine Frage...
Wie kann ich aus meinem Thread die Funktion "setze_style_gui" starten, die sich in meinem Mainloop (GUI) befindet. Die Funktion enthält Methoden von QWidgets!

Code: Alles auswählen

def setze_style_gui(self, is_standby):
self.is_standby = is_standby
if self.is_standby:
   self.label_1.setText...
   self.label_2.setStyleSheet ...
   self.schieber.setEnable(True)
   self.Progress_Bar.setValue(0)
else:
   self.label_1.setText...
   self.label_2.setStyleSheet ...
   self.schieber.setDisabled(True)
   
   # Thread #
... Schleife zum Schreiben der Daten...
   self.setze_style_standby
Kann ich das mit Signalen & Slots irgendwie abbilden? Ich habe ja hier kein Widget was das Signal sendet wie einen Button oder ähnliches?
Danke LG Tina
Antworten