Correct way to quit a Qt program?

QtResourcesExitQuit

Qt Problem Overview


How should I quit a Qt Program, e.g when loading a data file, and discovered file corruption, and user need to quit this app or re-initiate data file?

Should I:

  1. call exit(EXIT_FAILURE)
  2. call QApplication::quit()
  3. call QCoreApplication::quit()

And difference between (2) and (3)?

Qt Solutions


Solution 1 - Qt

QApplication is derived from QCoreApplication and thereby inherits quit() which is a public slot of QCoreApplication, so there is no difference between QApplication::quit() and QCoreApplication::quit().

As we can read in the documentation of QCoreApplication::quit() it "tells the application to exit with return code 0 (success).". If you want to exit because you discovered file corruption then you may not want to exit with return code zero which means success, so you should call QCoreApplication::exit() because you can provide a non-zero returnCode which, by convention, indicates an error.

It is important to note that "if the event loop is not running, this function (QCoreApplication::exit()) does nothing", so in that case you should call exit(EXIT_FAILURE).

Solution 2 - Qt

You can call qApp->exit();. I always use that and never had a problem with it.

If you application is a command line application, you might indeed want to return an exit code. It's completely up to you what the code is.

Solution 3 - Qt

If you're using Qt Jambi, this should work:

QApplication.closeAllWindows();

Solution 4 - Qt

While searching this very question I discovered this example in the documentation.

QPushButton *quitButton = new QPushButton("Quit");
connect(quitButton, &QPushButton::clicked, &app, &QCoreApplication::quit, Qt::QueuedConnection);

Mutatis mutandis for your particular action of course.

Along with this note.

> It's good practice to always connect signals to this slot using a > QueuedConnection. If a signal connected (non-queued) to this slot is > emitted before control enters the main event loop (such as before "int > main" calls exec()), the slot has no effect and the application never > exits. Using a queued connection ensures that the slot will not be > invoked until after control enters the main event loop. > > It's common to connect the QGuiApplication::lastWindowClosed() signal > to quit()

Solution 5 - Qt

if you need to close your application from main() you can use this code

int main(int argc, char *argv[]){
QApplication app(argc, argv);
...
if(!QSslSocket::supportsSsl()) return app.exit(0);
...
return app.exec();
}

The program will terminated if OpenSSL is not installed

Solution 6 - Qt

//How to Run App

bool ok = QProcess::startDetached("C:\\TTEC\\CozxyLogger\\CozxyLogger.exe");
qDebug() <<  "Run = " << ok;


//How to Kill App

system("taskkill /im CozxyLogger.exe /f");
qDebug() << "Close";

example

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestiondaisyView Question on Stackoverflow
Solution 1 - QtBillView Answer on Stackoverflow
Solution 2 - QtlaurentView Answer on Stackoverflow
Solution 3 - QtDurgarao MaruboinaView Answer on Stackoverflow
Solution 4 - QtsystemcproView Answer on Stackoverflow
Solution 5 - QtPetr TripolskyView Answer on Stackoverflow
Solution 6 - Qtuser3777664View Answer on Stackoverflow