Fenster nach app.exec_() schließen?

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Shaldy
User
Beiträge: 123
Registriert: Sonntag 2. März 2008, 22:49

Hey Leute!

Ich möchte ein Qt Programm schreiben, bin auch schon relativ weit gekommen. Nun möchte ich es so haben, dass am Anfang des Programms ein kleines Loginfenster erscheint. Ui hab ich fertig, das Programm funktioniert auch einwandfrei, nur soll jetzt, wenn der Login erfolgreich war das Fenster geschlossen werden und ein neues geöffnet werden.

Mein erster Ansatz war, innerhalb des Loginfensters (also innerhalb dessen Klasse) zu prüfen ob der Login erfolgreich war und von dort aus ein neues Fenster zu erstellen. Irgendwie kam mir das aber nicht ganz sauber vor.
Daher mein zweiter Ansatz: Ich habe statt app.exec_() einfach LoginDialog.exec_() geschrieben. Ist das sauber gecoded oder gibts nen besseren Weg, weil ja eigentlich die app die Events handeln soll oder seh ich das falsch?

Code: Alles auswählen

if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    test = Login()
    test.show()
    test.exec_()
    sys.exit(0)
Dies ist keine Signatur!
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

Das geht prinzipiell, da Dialog.exec_() eine eigene Ereignisschleife anstösst, welche mit Beenden der Methode wieder verlassen wird. Du müsstest dann halt für folgende Widgets erneut eine Ereignisschleife anstossen, also schematisch so:

Code: Alles auswählen

app = QApplication([])
login = QDialog()
login.exec_()
win = MainWidget(login.connection) # evtl. geöffnete Verbindung oder Login-Setupdaten weiterreichen
app.exec_() # Ereignisschleife muss nicht von QApplication kommen, könnte auch eine eigene QEventLoop analog zu QDialog sein
usw...
Da Du sicherlich auf den Loginerfolg reagieren und im Fehlerfalle das Loginfenster erneut darstellen willst, musst Du das noch um ein Schleifen-/Konditionsausdruck erweitern.

Was daran stört, ist das batchartige und wenig objektorientiert anmutende Design. JIch weiss nicht, was Du mit der Anwendung bezwecken willst, und das Design kann durchaus zielführend sein. Für eine qt-zentrische Anwendung würde man allerdings früher in den "OOP-Modus" wechseln und solche Setupdinge (Einstellungen laden, Login-Dialog, Konfigurationswizard etc.) von der Hauptklasse aus einbinden (ob in der GUI-Hauptklasse oder durch separate Klassen hängt wiederum von Szenario und Größe der Anwendung und nicht zuletzt vom Gusto des Programmierers ab)
Antworten