146

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

我是不是该:

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

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

4

6 回答 6

167

QApplication 是从 QCoreApplication 派生的,因此继承quit()了 的 public slot ,因此和QCoreApplication之间没有区别。QApplication::quit()QCoreApplication::quit()

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

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

于 2011-11-06T10:06:14.373 回答
33

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

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

于 2011-11-06T10:00:30.877 回答
1

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

QApplication.closeAllWindows();
于 2017-04-05T07:00:02.193 回答
1

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

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

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

连同这个笔记。

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

将 QGuiApplication::lastWindowClosed() 信号连接到 quit() 是很常见的

于 2020-12-01T22:41:31.440 回答
-1

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

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

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

于 2017-03-21T16:54:16.450 回答
-9
//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";

例子

于 2018-01-06T07:49:56.623 回答