[英]QApplication child objects not destroyed when the system is shut down
我有一个带有单个对话窗口的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
销毁,调用MyObject
析构函数。 换句话说,作为myObject
是一个孩子a
,不应该有任何需要处理aboutToQuit()
信号。
直接来自QApplication的文档:
我们建议您将清理代码连接到aboutToQuit()信号,而不是将其放在应用程序的main()函数中。 这是因为,在某些平台上,QApplication :: exec()调用可能不会返回。 例如,在Windows平台上,当用户注销时,系统会在Qt关闭所有顶级窗口后终止进程。 因此,在QApplication :: exec()调用之后,无法保证应用程序有时间退出其事件循环并在main()函数结束时执行代码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.