为什么在exec()之前调用quit()不退出应用程序?

use*_*674 6 qt

为什么这个程序正常运行并显示主窗口?我希望它退出,因为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();
}
Run Code Online (Sandbox Code Playgroud)

MainWindow.cpp:

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

void MainWindow::closeEvent(QCloseEvent *)
{
    qDebug("Hello world!");
}
Run Code Online (Sandbox Code Playgroud)

Job*_*Job 8

呼叫QCoreApplication::quit()与呼叫相同QCoreApplication::exit(0).

如果你看一下后一个函数的文档:

调用此函数后,应用程序将离开主事件循环并从调用返回到exec().exec()函数返回returnCode.如果事件循环未运行,则此函数不执行任何操作.

在您的示例中,当MainWindow调用s构造函数时,事件循环尚未启动,因此调用quit()不执行任何操作.


Rei*_*ica 8

由于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);
Run Code Online (Sandbox Code Playgroud)