【问题标题】:Why does calling quit() before exec() not quit the application?为什么在 exec() 之前调用 quit() 不会退出应用程序?
【发布时间】:2012-04-09 04:45:39
【问题描述】:

为什么这个程序运行正常并显示主窗口?我希望它会退出,因为在构造函数中调用了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!");
}

【问题讨论】:

    标签: qt


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      如果你看后一个函数的docs

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多