2010-03-01 17 views
8

Ich habe eine Qt-Anwendung, die eine QMainWindow-abgeleitete 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 Prüfungen im QMainWindow Konstruktor, aber wenn ich die close Methode aufrufen, passiert nichts und die Anwendung läuft weiter. Zum Beispiel:Schließen eines QMainWindow beim Start?

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) 
{ 
    setupUi(this); 
    ... 
    if (checkFails()) 
    { 
     QMessageBox::warning(this, tr("Error"), tr("You cannot run this app")); 
     // This has no effect 
     close(); 
    } 
} 

Alternativ die Kontrollen in der Hauptfunktion konnte ich machen, aber dann verliere ich die Möglichkeit, ein sprachspezifische Meldungsfeld angezeigt werden (die tr Makro funktioniert nur in einer QObject abgeleiteten Klasse von den Blicken von Dinge.)

Irgendwelche Ideen, wie man das Hauptfenster beim Start schließt oder das tr Makro arbeitet außerhalb einer QObject abgeleiteten Klasse?

Antwort

23

Die Ereignisschleife muss ausgeführt werden, bevor Sie das Hauptfenster erfolgreich schließen können. Da Sie wahrscheinlich zuerst ein Fenster erstellen und dann die Ereignisschleife starten, hat der Aufruf close() keinen Effekt. Versuchen Sie, die folgende Lösung statt:

QTimer::singleShot(0, this, SLOT(close())); 

Die QTimer::singleShot() wird ausgelöst, sobald eine Ereignisschleife gestartet wurde, und anschließend ruft die close() Methode auf Ihrem Hauptfenster der Anwendung.

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 unter QObject verfügbar ist, kann dies über die Hauptfunktion erfolgen.

2

tr ist ein public static member von QObject. Sie sollten QObject::tr("Error") in Ihrer Hauptfunktion aufrufen können.

0

Haben Sie versucht, das Fenster zuerst zu verstecken() sollte dies geschehen, wenn close() aufgerufen wird), um zu sehen, ob dies dann erlaubt, close() das Fenster zu zerstören.

Wenn dies nicht funktioniert, können Sie versuchen, das Fenster mit allen Unterfenstern zu zerstören (true, true).

2

Die meisten Anwendungen starten in drei Schritten: 1) konstruiere das Fenster; 2) zeige das Fenster; 3) Starten Sie die Ereignisschleife. Sie können machen die Schritte 2 und 3 abhängig, den Erfolg von Schritt 1 durch einen Flag hinzugefügt, dessen Wert durch das Fenster Konstruktor festgelegt, auf die Fensterklasse:

Window-Klasse:

class myMainWindowClass : public QMainWindow 
{ 
    Q_OBJECT 
public: 
    myMainWindowClass() 
    : isFinished_(false) { if (error) isFinished_ = true; } // constructor 

    bool isFinished() const { return isFinished_; } 
private: 
    bool isFinished_; 
} 

Code Anwendung:

Dies sollte auch Flimmern vermeiden, da die Anwendung beendet wird, bevor das Fenster angezeigt wird() n.