ChatGPT解决这个技术问题 Extra ChatGPT

退出Qt程序的正确方法?

我应该如何退出 Qt 程序,例如在加载数据文件时,发现文件损坏,用户需要退出此应用程序或重新启动数据文件?

我是不是该:

调用 exit(EXIT_FAILURE) 调用 QApplication::quit() 调用 QCoreApplication::quit()

(2)和(3)之间的区别?


B
Bill

QApplication 是从 QCoreApplication 派生的,因此继承了 quit(),它是 QCoreApplication 的公共槽,因此 QApplication::quit()QCoreApplication::quit() 之间没有区别。

正如我们在 QCoreApplication::quit() 的文档中看到的那样,它“告诉应用程序退出并返回代码 0(成功)。”。如果您因为发现文件损坏而想要退出,那么您可能不想以返回代码零退出,这意味着成功,因此您应该调用 QCoreApplication::exit(),因为您可以提供一个非零的 returnCode,按照惯例,它表示错误。

需要注意的是,“如果事件循环没有运行,这个函数 (QCoreApplication::exit()) 什么都不做”,所以在这种情况下你应该调用 exit(EXIT_FAILURE)


L
Lennart Rolland

您可以致电 qApp->exit();。我总是使用它,从来没有遇到过问题。

如果您的应用程序是命令行应用程序,您可能确实想要返回退出代码。代码是什么完全取决于您。


我需要执行以下操作:qApp->exit();
M
Michael Mrozek

如果您使用的是 Qt Jambi,这应该可以:

QApplication.closeAllWindows();

s
systemcpro

在搜索这个问题时,我在 documentation 中发现了这个示例。

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

当然,对于您的特定行为,请进行必要的修改。

连同这个笔记。

始终使用 QueuedConnection 将信号连接到此插槽是一种很好的做法。如果在控制进入主事件循环之前(例如在“int main”调用 exec() 之前)发出连接(非排队)到该插槽的信号,则该插槽无效并且应用程序永远不会退出。使用排队连接可确保在控制进入主事件循环之前不会调用插槽。将 QGuiApplication::lastWindowClosed() 信号连接到 quit() 是很常见的


P
Petr Tripolsky

如果您需要从 main() 关闭您的应用程序,您可以使用此代码

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

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


我认为这不会编译。 app.exit(0) 不返回 int。使用 if(!QSslSocket::supportsSsl()) {return 0;};。因为在这一行没有调用 app.exec(),所以 app.exit(0) 什么都不做,参见 QCoreApplication::exit() 的文档:如果事件循环没有运行,这个函数什么也不做。< /我>
C
Community
//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


问题不在于分离新流程
请在您的答案中添加一些解释,以便其他人可以从中学习

关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅