繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM