我有一个带有单个对话窗口的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
是a
的孩子,因此不需要处理aboutToQuit()
信号。
答案 0 :(得分:3)
直接来自QApplication的文档:
我们建议您将清理代码连接到aboutToQuit()信号,而不是将其放在应用程序的main()函数中。这是因为,在某些平台上,QApplication :: exec()调用可能不会返回。例如,在Windows平台上,当用户注销时,系统会在Qt关闭所有顶级窗口后终止进程。因此,在QApplication :: exec()调用之后,无法保证应用程序有时间退出其事件循环并在main()函数结束时执行代码。