2012-04-09 1 views
6

이 프로그램이 정상적으로 실행되고 기본 창을 표시하는 이유는 무엇입니까? quit()이 생성자에서 호출되기 때문에 종료 할 것으로 예상됩니다.exec()가 호출되기 전에 quit()를 호출하면 응용 프로그램이 종료되지 않는 이유는 무엇입니까?

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

답변

7

QCoreApplication::quit() 호출은 QCoreApplication::exit(0)를 호출 한 것과 같은 상태가된다. 당신이 후자의 함수의 docs 보면

가 :

이 함수가 호출 된 후, 응용 프로그램 간부에 대한 호출에서 주요 이벤트 루프 돌아 잎(). exec() 함수 은 returnCode를 반환합니다. 이벤트 루프가 실행 중이 아니면 이 함수는을 수행하지 않습니다. MainWindow 생성자가 호출 될 때

는 예에서, 이벤트 루프는 따라서 quit()에 대한 호출은 아무것도하지 않는, 아직 시작되지 않았습니다.

+0

좋은 도움을 주셔서 감사합니다. – user1318674

6

QCoreApplication::quit()은 이벤트 루프가 시작될 때까지 아무 작업도 수행하지 않으므로 시작될 때까지 호출을 지연시켜야합니다. 따라서 지연 메소드 호출을 quit()에 대기열에 넣으십시오.

다음 줄 functionally identical 있으며, 둘 중 하나가 작동합니다!

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); 
관련 문제