Q系统关闭时未销毁的子对象

QApplication child objects not destroyed when the system is shut down

本文关键字:对象 系统      更新时间:2023-10-16

我有一个带有单个对话框窗口的Qt应用程序。主要看起来像这样:

QApplication a(argc, argv);
MyObject * myMobject = new QObject(&a);
MainWindow w;
w.show();
return a.exec();

MyObject构造函数创建一个临时文件,析构函数将其删除。

当我通过关闭对话框正常关闭应用程序时,MyObject析构函数按预期调用,因为它是QApplication的子级,在main()中分配给堆栈。

但是,当用户会话关闭(注销、关机等)时,不会删除该文件,这表明永远不会调用MyObject析构函数。

这是什么原因呢?我虽然 Windows 在会话关闭之前关闭了每个窗口,但看起来我的进程已终止。

从文档中可以看出QCoreApplication::aboutToQuit()信号。但本文档告诉Qt检测到关机并退出事件循环,在最后发出该信号。

如果真的是这样,a.exec()应该返回,就像窗口关闭时一样,QApplication应该与其子项一起销毁,调用MyObject析构函数。换句话说,由于myObjecta的子代,因此不需要处理aboutToQuit()信号。

直接来自QApplication的文档:

我们建议您将清理代码连接到 aboutToQuit() 信号,而不是将其放在应用程序的 main() 函数中。这是因为,在某些平台上,QApplication::exec() 调用可能不会返回。例如,在Windows平台上,当用户注销时,系统会在Qt关闭所有顶级窗口后终止进程。因此,不能保证应用程序有时间退出其事件循环并在 main() 函数的末尾执行代码,在 QApplication::exec() 调用之后。