如何正确退出Qt程序?

151

当在Qt程序中加载数据文件时发现文件损坏,用户需要退出该应用或重新初始化数据文件时,应该如何退出程序?

以下哪种方法是正确的:

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

(2)和(3)之间有什么区别?


注:exit() 是 C++ 标准库函数, QApplication::quit() 和 QCoreApplication::quit() 是 Qt 程序框架提供的函数。
6个回答

172

QApplication继承自QCoreApplication,因此继承了QCoreApplication的公共槽函数quit(),所以QApplication::quit()和QCoreApplication::quit()没有区别。

根据QCoreApplication::quit()文档所述:它"告诉应用程序使用返回代码0(成功)退出"。如果您想因为发现文件损坏而退出,则不应该使用返回码0表示成功,这种情况下您应该调用QCoreApplication::exit(),因为您可以提供一个非零的返回码,按照惯例,这表示发生错误。

需要注意的是"如果事件循环未运行,则此函数(QCoreApplication::exit())不会执行任何操作",所以在这种情况下您应该调用exit(EXIT_FAILURE)


33
你可以调用qApp->exit();。我经常使用它,并且从未遇到问题。
如果你的应用程序是一个命令行应用程序,你可能确实想要返回一个退出码。退出码是完全由你决定的。

5
我需要执行以下操作:qApp->exit(); - Frederick Ollinger

2
在搜索这个问题时,我在文档中发现了这个例子。
QPushButton *quitButton = new QPushButton("Quit");
connect(quitButton, &QPushButton::clicked, &app, &QCoreApplication::quit, Qt::QueuedConnection);

Mutatis mutandis 当然适用于您特定的操作。
随附此注释。
引用: 始终使用QueuedConnection将信号连接到此插槽是一个好习惯。如果在控制进入主事件循环之前(例如在“int main”调用exec()之前)发射了连接到此插槽的信号(非排队),则插槽无效,应用程序永远不会退出。使用排队连接确保插槽在控制进入主事件循环之后才被调用。 将QGuiApplication :: lastWindowClosed()信号连接到quit()是常见做法。

0
如果您正在使用Qt Jambi,这应该可以运行:
QApplication.closeAllWindows();

请参见https://doc.qt.io/qt-6/qguiapplication.html#quitOnLastWindowClosed-prop,了解有关编程的更多信息。 - ManuelSchneid3r

-1
如果你需要在main()函数中关闭你的应用程序,你可以使用以下代码。
int main(int argc, char *argv[]){
QApplication app(argc, argv);
...
if(!QSslSocket::supportsSsl()) return app.exit(0);
...
return app.exec();
}

如果未安装OpenSSL,程序将终止。

2
我认为这个代码无法编译。app.exit(0)没有返回int类型。请使用if(!QSslSocket::supportsSsl()) {return 0;};。因为在此行未调用app.exec(),所以app.exit(0)不会执行任何操作,请参考QCoreApplication::exit()的文档:如果事件循环没有运行,则此函数不执行任何操作。 - Sacha Guyer

-10
//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";

示例


1
问题不是关于分离新进程。 - rookie coder
1
请在您的答案中添加一些解释,以便其他人可以从中学习。 - Nico Haase

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接