2012-04-09 12 views
6

Dlaczego ten program działa normalnie i wyświetla główne okno? Spodziewam się, że to zakończy, ponieważ wywoływana jest quit() w konstruktorze.Dlaczego wywołanie quit() przed exec() nie powoduje zamknięcia aplikacji?

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!"); 
} 

Odpowiedz

7

Wywołanie QCoreApplication::quit() jest taka sama jak wywołanie QCoreApplication::exit(0).

Jeśli spojrzeć na docs tej ostatniej funkcji:

Po funkcja ta została nazwana, wniosek pozostawia główną pętlę zdarzeń i powrót z wywołania exec(). Funkcja exec() zwraca kod powrotu. Jeśli pętla zdarzeń nie jest uruchomiona, ta funkcja nic nie robi.

w was przykład, pętla zdarzenie nie zostało jeszcze rozpoczęte, gdy MainWindow s konstruktor nazywa, stąd wywołanie quit() nic nie robi.

+0

dobra dzięki za pomoc. – user1318674

6

Ponieważ QCoreApplication::quit() nie jest operacją do czasu uruchomienia pętli zdarzeń, należy odłożyć połączenie, dopóki się nie uruchomi. Zatem, umieść w kolejce odroczone wywołanie metody do quit().

Następujące linie są functionally identical, albo będzie jedną pracę:

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); 
Powiązane problemy