2012-04-09 7 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:QCoreApplication::quit()を呼び出す

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

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

答えて

7

QCoreApplication::exit(0)を呼び出すことと同じです。

あなたは後者の機能のdocsを見れば:

この関数が呼び出された後、アプリケーションは)(exec呼び出しからメイン イベントループとリターンを残します。 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); 
関連する問題