如何在Qt退出时清理

sma*_*llB 24 qt

在应用程序退出之前,我想在Qt应用程序中做一些管家事务(比如写文件等).如何在Qt中使用此函数(退出或其他任何调用)?

Sil*_*ker 34

您需要将带有清理代码的插槽连接到QCoreApplication::aboutToQuit()信号.

这允许您删除QObjects,QObject::deleteLater()并且当您尚未离开主应用程序事件循环时将删除对象.

如果您使用的是需要"关闭"调用的C库,通常可以在返回后执行此操作QCoreApplication::exec().

两种技术的示例:

int main(int,char**)
{
  QApplication app;
  library_init();
  QWidget window;
  window.show();
  QObject::connect(&app, SIGNAL(aboutToQuit()), &window, SLOT(closing()));
  const int retval = app.exec();
  library_close();
  return retval;
}
Run Code Online (Sandbox Code Playgroud)

  • 请注意,当前的Qt文档特别建议不要在exec返回后执行任何操作.见(http://doc.qt.io/qt-5/qapplication.html#exec) (3认同)

Cor*_*ein 9

关于Silas Parker的回答,Qt文档说明了这个aboutToQuit信号:

如果您的应用程序必须进行最后一秒的清理,则该信号特别有用.请注意,在此状态下无法进行用户交互.

如果您希望应用程序能够取消现有流程或允许用户在应用程序关闭之前执行最后一分钟更改,那么您可以通过处理您的应用程序中的closeEvent功能来执行此操作MainWindow.

void MainWindow::closeEvent(QCloseEvent *event)
{
    if (maybeSave()) {
        writeSettings();
        event->accept();
    } else {
        event->ignore();
    }
}
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅closeEvent文档.