Ein QMainWindow beim Start schließen?

8

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:

%Vor%

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?

    
Rob 01.03.2010, 15:20
quelle

4 Antworten

23

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:

%Vor%

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.

    
Ton van den Heuvel 01.03.2010, 15:49
quelle
2

tr ist ein öffentliches statisches Mitglied von QObject. Sie sollten QObject::tr("Error") in Ihrer Hauptfunktion aufrufen können.

    
Rupert Jones 01.03.2010 15:27
quelle
2

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 wird     
Phil Tresadern 15.05.2012 11:36
quelle
0

Haben 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).

    
Ali Lown 01.03.2010 15:33
quelle

Tags und Links