8

このプログラムが正常に実行され、メイン ウィンドウが表示されるのはなぜですか? 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!");
}
4

2 に答える 2

11

イベントループが開始されるまで何もしないのでQCoreApplication::quit()、開始するまで呼び出しを延期する必要があります。したがって、 への遅延メソッド呼び出しをキューに入れますquit()

次の行は機能的に同一で、どちらでも機能します。

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);
于 2015-06-26T20:12:42.140 に答える
10

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

後者の関数のドキュメントを見ると:

この関数が呼び出された後、アプリケーションはメイン イベント ループを離れ、exec() の呼び出しから戻ります。exec() 関数は returnCode を返します。イベント ループが実行されていない場合、この関数は何もしません

あなたの例では、コンストラクターが呼び出されたときにイベントループがまだ開始されていないMainWindowため、呼び出しは何もしquit()ません。

于 2012-04-09T07:18:11.047 に答える