我应该如何退出 Qt 程序,例如在加载数据文件时,发现文件损坏,用户需要退出此应用程序或重新启动数据文件?
我是不是该:
- 称呼
exit(EXIT_FAILURE)
- 称呼
QApplication::quit()
- 称呼
QCoreApplication::quit()
(2)和(3)之间的区别?
QApplication 是从 QCoreApplication 派生的,因此继承quit()
了 的 public slot ,因此和QCoreApplication
之间没有区别。QApplication::quit()
QCoreApplication::quit()
正如我们在QCoreApplication::quit()
它的文档中所读到的, “告诉应用程序以返回码 0(成功)退出”。. 如果您因为发现文件损坏而想要退出,那么您可能不想以返回代码零退出,这意味着成功,因此您应该调用QCoreApplication::exit()
,因为您可以提供一个非零的 returnCode,按照惯例,它表示错误。
重要的是要注意“如果事件循环没有运行,这个函数 (QCoreApplication::exit()) 什么也不做”,所以在这种情况下你应该调用exit(EXIT_FAILURE)
.
你可以打电话qApp->exit();
。我总是使用它,从来没有遇到过问题。
如果您的应用程序是命令行应用程序,您可能确实想要返回退出代码。代码是什么完全取决于您。
如果您使用的是 Qt Jambi,这应该可以:
QApplication.closeAllWindows();
在搜索这个问题时,我在文档中发现了这个示例。
QPushButton *quitButton = new QPushButton("Quit");
connect(quitButton, &QPushButton::clicked, &app, &QCoreApplication::quit, Qt::QueuedConnection);
当然,对于您的特定行为,请进行必要的修改。
连同这个笔记。
始终使用 QueuedConnection 将信号连接到此插槽是一种很好的做法。如果在控制进入主事件循环之前(例如在“int main”调用 exec() 之前)发出连接(非排队)到该插槽的信号,则该插槽无效并且应用程序永远不会退出。使用排队连接可确保在控制进入主事件循环之前不会调用插槽。
将 QGuiApplication::lastWindowClosed() 信号连接到 quit() 是很常见的
如果您需要从 main() 关闭您的应用程序,您可以使用此代码
int main(int argc, char *argv[]){
QApplication app(argc, argv);
...
if(!QSslSocket::supportsSsl()) return app.exit(0);
...
return app.exec();
}
如果未安装 OpenSSL,程序将终止
//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";