系统关闭时,QApplication子对象不会被销毁

时间:2016-06-10 19:02:25

标签: c++ qt

我有一个带有单个对话窗口的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()信号。

1 个答案:

答案 0 :(得分:3)

直接来自QApplication的文档:

  

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