8

为什么这个程序运行正常并显示主窗口?我希望它退出,因为quit()在构造函数中被调用。

主要.cpp:

#include<QApplication>
#include"MainWindow.h"

int main(int argc, char* argv[])
{
    QApplication app(argc, argv);
    MainWindow mainWindow;
    mainWindow.show();
    return app.exec();
}

主窗口.cpp:

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

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

2 回答 2

11

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

调用QCoreApplication::quit()与调用相同QCoreApplication::exit(0)

如果您查看后一个函数的文档

调用此函数后,应用程序离开主事件循环并从对 exec() 的调用中返回。exec() 函数返回 returnCode。如果事件循环没有运行,这个函数什么也不做

在您的示例中,当调用 s 构造函数时,事件循环尚未启动MainWindow,因此调用quit()什么也不做。

于 2012-04-09T07:18:11.047 回答