【问题标题】:Correct way to quit a Qt program?退出Qt程序的正确方法?
【发布时间】:2011-12-22 23:45:23
【问题描述】:

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

我应该:

  1. 致电exit(EXIT_FAILURE)
  2. 致电QApplication::quit()
  3. 致电QCoreApplication::quit()

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

【问题讨论】:

    标签: qt resources exit quit


    【解决方案1】:

    QApplication 是从 QCoreApplication 派生出来的,因此继承了quit()QCoreApplication 的公共槽,所以QApplication::quit()QCoreApplication::quit() 没有区别。

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

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

    【讨论】:

      【解决方案2】:

      您可以拨打qApp->exit();。我一直使用它,从来没有遇到过问题。

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

      【讨论】:

      • 我需要做以下事情:qApp->exit();
      【解决方案3】:

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

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

      当然比照你的特定行动。

      附上这份笔记。

      最好始终使用 排队连接。如果连接(非排队)到该插槽的信号是 在控制进入主事件循环之前发出(例如在“int main" 调用 exec()),插槽无效,应用程序永远不会 退出。使用排队连接可确保插槽不会 直到控制进入主事件循环后才被调用。

      连接 QGuiApplication::lastWindowClosed() 信号很常见 退出()

      【讨论】:

        【解决方案4】:

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

        QApplication.closeAllWindows();
        

        【讨论】:

          【解决方案5】:

          如果您需要从 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() 的文档:如果事件循环没有运行,这个函数什么都不做。
          【解决方案6】:
          //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

          【讨论】:

          • 问题不在于分离新进程
          • 请在您的答案中添加一些解释,以便其他人可以从中学习
          猜你喜欢
          • 2016-11-12
          • 2010-09-26
          • 2012-01-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多