2012-04-09 2 views
6

Warum läuft dieses Programm normal und zeigt das Hauptfenster an? Ich würde erwarten, dass es beendet wird, da quit() im Konstruktor aufgerufen wird.Warum beendet das Aufrufen von quit() vor exec() die Anwendung nicht?

Main.cpp:

#include<QApplication> 
#include"MainWindow.h" 

int main(int argc, char* argv[]) 
{ 
    QApplication app(argc, argv); 
    MainWindow mainWindow; 
    mainWindow.show(); 
    return app.exec(); 
} 

mainwindow.cpp:

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent) 
{ 
    qApp->quit(); 
} 

void MainWindow::closeEvent(QCloseEvent *) 
{ 
    qDebug("Hello world!"); 
} 

Antwort

7

QCoreApplication::quit() Aufruf ist die gleiche QCoreApplication::exit(0) wie der Aufruf.

Wenn man sich die docs der letzteren Funktion aussehen:

Nachdem diese Funktion aufgerufen wurde, wird die Anwendung verlässt die Haupt Ereignisschleife und kehrt aus dem Aufruf (exec). Die Funktion exec() gibt returnCode zurück. Wenn die Ereignisschleife nicht ausgeführt wird, tut diese Funktion nichts.

In Ihrem Beispiel hat die Ereignisschleife noch nicht gestartet, wenn MainWindow Konstruktor aufgerufen wird, damit der Aufruf an quit() nichts tut.

+0

guter Dank für die Hilfe. – user1318674

6

Da QCoreApplication::quit() ein No-Op ist, bis die Ereignisschleife gestartet wurde, müssen Sie den Anruf aufschieben, bis er startet. Weisen Sie daher einen verzögerten Methodenaufruf an quit().

Die folgenden Zeilen sind functionally identical, entweder funktioniert:

QTimer::singleShot(0, qApp, &QCoreApplication::quit); 
//or 
QTimer::singleShot(0, qApp, SLOT(quit())); 
// or - see https://stackoverflow.com/a/21653558/1329652 
postToThread([]{ QCoreApplication::quit(); }); 
// or 
QMetaObject::invokeMethod(qApp, "quit", Qt::QueuedConnection); 
Verwandte Themen