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