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

时间:2012-04-09 04:45:39

标签: 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();
}

MainWindow.cpp:

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

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

2 个答案:

答案 0 :(得分:8)

致电QCoreApplication::quit()与致电QCoreApplication::exit(0)相同。

如果你看一下后一个函数的docs

  

调用此函数后,应用程序将离开main   事件循环并从对exec()的调用返回。 exec()函数   返回returnCode。 如果事件循环未运行,则此功能   什么都不做

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

答案 1 :(得分:8)

由于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);