【问题标题】:QApplication child objects not destroyed when the system is shut downQApplication子对象在系统关闭时没有被销毁
【发布时间】:2016-06-10 19:02:24
【问题描述】:

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

【问题讨论】:

标签: c++ qt


【解决方案1】:

直接来自 QApplication 的文档:

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

【讨论】:

  • 该死的,我是 RTFM 的。他们本可以将其添加到 aboutToQuit() 中
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-03
  • 2013-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-24
相关资源
最近更新 更多