Ich habe eine Qt-Anwendung, die eine QMainWindow
-dedived-Klasse für die Hauptbenutzeroberfläche verwendet. Beim Start möchte ich einige Sicherheitsüberprüfungen durchführen und, falls sie fehlschlagen, dem Benutzer eine Nachricht anzeigen und das Hauptfenster schließen. Derzeit mache ich diese Überprüfungen im Konstruktor QMainWindow
, aber wenn ich die Methode close
aufruft, passiert nichts und die Anwendung läuft weiter. Zum Beispiel:
Alternativ könnte ich die Checks in der Hauptfunktion machen, aber dann verliere ich die Fähigkeit, ein sprachspezifisches Meldungsfeld anzuzeigen (das Makro tr
funktioniert nur in einer QObject
-abgeleiteten Klasse nach dem Aussehen der Dinge.)
Irgendwelche Ideen, wie man das Hauptfenster beim Start schließt oder das Makro tr
außerhalb einer QObject
abgeleiteten Klasse arbeiten lässt?
Die Ereignisschleife muss ausgeführt werden, bevor Sie das Hauptfenster erfolgreich schließen können. Da Sie wahrscheinlich zuerst ein Fenster konstruieren und dann die Ereignisschleife starten, hat der Aufruf close()
keine Auswirkung. Versuchen Sie stattdessen die folgende Lösung:
Der QTimer::singleShot()
wird ausgelöst, sobald eine Ereignisschleife gestartet wurde, und ruft anschließend die Methode close()
im Hauptfenster Ihrer Anwendung auf.
Die obige Lösung wird wahrscheinlich dazu führen, dass Ihr Hauptanwendungsfenster für eine kurze Zeit sichtbar ist, was zu unerwünschtem Flackern führt.
Eine sauberere Lösung sollte die Sicherheitsprüfungen vor dem Erstellen des Hauptfensters durchführen. Da tr()
auch als statische Methode für QObject
verfügbar ist, kann dies über die Hauptfunktion erfolgen.
tr
ist ein öffentliches statisches Mitglied von QObject. Sie sollten QObject::tr("Error")
in Ihrer Hauptfunktion aufrufen können.
Die meisten Anwendungen starten in drei Schritten: 1) konstruiere das Fenster; 2) zeige das Fenster; 3) Starten Sie die Ereignisschleife. Sie können die Schritte 2 und 3 vom Erfolg von Schritt 1 abhängig machen, indem Sie der Fensterklasse ein Flag hinzufügen, dessen Wert vom Fensterkonstruktor festgelegt wird:
Fensterklasse:
%Vor%Anwendungscode:
%Vor%Dies sollte auch Flimmern vermeiden, da die Anwendung endet, bevor das Fenster show () n.
angezeigt wirdHaben Sie versucht, zuerst das Fenster zu verstecken (dies sollte sowieso passieren, wenn close () aufgerufen wird), um zu sehen, ob dies dann clos () erlaubt, das Fenster zu zerstören.
Wenn das nicht funktioniert, können Sie versuchen, das Fenster mit allen Unterfenstern zu zerstören (true, true).