Why does calling quit() before exec() not quit the application?

前端 未结 2 1146
旧时难觅i
旧时难觅i 2020-11-30 11:55

Why does this program run normally and display the main window? I would expect it to exit since quit() is called in the constructor.

Main.cpp:

相关标签:
2条回答
  • 2020-11-30 12:14

    Since QCoreApplication::quit() is a no-op until the event loop has been started, you need to defer the call until it starts. Thus, queue a deferred method call to quit().

    The following lines are functionally identical, either one will work:

    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);
    
    0 讨论(0)
  • 2020-11-30 12:22

    Calling QCoreApplication::quit() is the same as calling QCoreApplication::exit(0).

    If you look at the docs of the latter function:

    After this function has been called, the application leaves the main event loop and returns from the call to exec(). The exec() function returns returnCode. If the event loop is not running, this function does nothing.

    In you example, the event loop has not been started yet when MainWindows constructor is called, hence the call to quit() does nothing.

    0 讨论(0)
提交回复
热议问题