Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

Tags:

qt

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:

#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!");
}
like image 473
user1318674 Avatar asked Apr 09 '12 04:04

user1318674


2 Answers

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);
like image 84
Kuba hasn't forgotten Monica Avatar answered Feb 23 '23 21:02

Kuba hasn't forgotten Monica


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.

like image 41
mtvec Avatar answered Feb 23 '23 20:02

mtvec