QMainWindow initalisieren und QThread

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
ichisich
User
Beiträge: 134
Registriert: Freitag 1. Januar 2010, 11:52

Hallo zusammen,

ich möchte gerne wärend mein MainWindow mit all seinen Geschichten geladen wird einen QSplashScreen zeigen.

Code: Alles auswählen

app = QtGui.QApplication(sys.argv)
splash = QtGui.QSplashScreen(pixmap,  Qt.WindowStaysOnTopHint)
splash.show()
myMainWindow = MainWindow()
myMainWindow.show()
splash.finish(myMainWindow)
app.exec_()

Jetzt dauert das initialisieren des MainWindows aber länger als mein splash gezeigt wird, also der SPlashScreen wird geschlossen und das MainWindow kommt in den Vordergrund aber ist noch "eingefroren" (etwa 3-4 sec) bis alles soweit initailisiert ist.

Diese Zeit nöchte ich gerne den SplashScreen im Vordergrund lassen.

Jetzt steig ich nicht ganz durch woher ich mit bekommen soll das mein MainWindow wirklich fertig initialisiert wurde.

Abwarten bis zum app.exec_() scheint ja nicht zu tun, also müßte ich irgend einen Thread abfragen oder gar erst starten.

Kann mir da jemand auf die Sprünge helfen wo ich ansetzten muss ?

Grüße
ichisich
User
Beiträge: 134
Registriert: Freitag 1. Januar 2010, 11:52

Ok ok ...

Ansich war mein Logik richtig vor dem "app.exec_()" zu warten so wie es ja auch in der Doku und etlichen Beispielen beschrieben ist.

Was ich vergessen hatte waren zwei "QTimer.singleShots() in meinen tabWidgets auf die ich nicht gewartet habe, die aber erheblich länger brauchen.

Gruß
lunar

Vor "QApplication.exec()" werden QTimer nie ausgelöst, da das Auslösen von Timer-Ereignissen eine laufende Ereignisschleife benötigt, die aber erst durch QApplication.exec() gestartet wird.

Das gilt allgemein für jede Klasse, die Ereignisse behandelt und/oder auslöst (allerdings nicht allgemein für Signale und Slots).
ichisich
User
Beiträge: 134
Registriert: Freitag 1. Januar 2010, 11:52

Ich versteh nicht ganz:

Evt. liegt es daran das ich nicht genau genug beschrieben habe was ich tu.

Ich rufe im Konstruktor des MainWindows

Code: Alles auswählen

QTimer.singleShot(0, meineFunktion)
auf.

Da scheint es sich wohl anders zu verhalten weil das Ergebnis wenn ich "meineFunktion()" ohne QTimer.singleShot aufruf genau wie erwartet ist. Meinen SplashScreen verschwindet erst dann wenn MainWindow fertig initalisiert wurde und Eingaben annehmen kann.

Das
As a special case, a QTimer with a timeout of 0 will time out as soon as all the events in the window system's event queue have been processed. This can be used to do heavy work while providing a snappy user interface:
sagt die Doku dazu, wobei daraus für mich nicht hervorgeht ob das eine laufende Ereignisschleife vorraussetzt.


Danke und Gruß
lunar

Natürlich funktioniert ein direkter Aufruf anders als der Aufruf über "QTimer.singleShot()" mit Timeout 0. Wenn Dir das nicht klar ist, warum hast Du dann überhaupt "QTimer.singleShot()" eingesetzt?

In jedem Fall wird eine Funktion selbst mit Timeout 0 frühestens nach "QApplication.exec()" aufgerufen. Im von Dir zitierten Abschnitt heißt es doch deutlich "as soon as all the events in the window system's event queue have been processed". Das setzt natürlich eine laufende Ereignissschleife voraus, denn anders können gar keine Ereignisse behandelt werden.
ichisich
User
Beiträge: 134
Registriert: Freitag 1. Januar 2010, 11:52

warum hast Du dann überhaupt "QTimer.singleShot()" eingesetzt?!
Höhere Eingebung :)

Hab ich aus einem Beispiel übernommen ohne weiter darüber nachzudenken.

Sauber durch debugged wird genau das bestätigt was Du schreibst. Die singleShots werden erst nach app.exec_() ausgeführt. Danke an dieser Stelle für die Lehrstunde.

Trotzallem oder genau deswegen versteh ich nicht warum es sich dann so dermaßen anders verhält wenn ich die singleShots rausnehme.

Dank deiner Hinweise hab ich jetzt das "splash.finish(myMainWindow)" kurzerhand auch in einen singleShot gepackt was den Effekt hat dass es jetzt auch erst nach dem app.exec_() ausgeführt, was mir mein gewünschtes Verhalten bringt.
lunar

Wenn Du Funktionen ohne QTimer ganz normal aufrufst, werden sie natürlich sofort ausgeführt, in diesem Fall eben vor QApplication.exec() und vor dem Schließen des Splashs.

Irgendwie verstehe ich Dein Verständnisproblem daher nicht :)
ichisich
User
Beiträge: 134
Registriert: Freitag 1. Januar 2010, 11:52

So gesehen ist es verdammt logisch :lol:

Danke für die Geduld ...

Gruß
Antworten