在 Windows 上调用虚拟函数QApplication::saveState
和QApplication::commitData
的时间是什么时候?
它们是否被调用,或者会话管理只是一个UNIX的东西?
如果用户退出时应用程序正在运行(并强行关闭应用程序),是否会调用它们?
答案 0 :(得分:4)
我写了一个简单的测试应用程序;见下文。我用Qt 4.7和MSVS 2010编译了应用程序并在Windows XP上运行它。然后我跑了三个不同的测试:
测试结果:
以下是测试应用的代码。 commitData和saveState函数没有做任何有用的事情;该应用程序的唯一目的是检查它们是否被调用。
#include <QtCore/QtCore>
#include <QtGui/QtGui>
#include <fstream>
class MyApplication : public QApplication {
public:
MyApplication(int& argc, char** argv) : QApplication(argc, argv) {}
virtual void saveState(QSessionManager& manager)
{
std::ofstream ofs("SaveState.txt");
ofs << "Test";
}
virtual void commitData(QSessionManager& manager)
{
std::ofstream ofs("CommitData.txt");
ofs << "Test";
}
};
int main(int argc, char** argv)
{
{
std::ofstream ofs("Begin.txt");
ofs << "Test";
}
MyApplication app(argc, argv);
QMainWindow mw;
mw.show();
app.exec();
{
std::ofstream ofs("End.txt");
ofs << "Test";
}
}
答案 1 :(得分:2)
来自文档:
当Windows应用程序收到commitData() is called窗口消息时,使会话管理与Qt一起使用
首先重新实现QApplication :: commitData()以使您的应用程序能够参与正常的注销过程。如果您只定位到Microsoft Windows平台,那么 (重点补充)
来自WM_QUERYENDSESSION文档:
当用户选择结束会话或应用程序调用其中一个系统关闭功能时,将发送WM_QUERYENDSESSION消息。如果任何应用程序返回零,则会话不会结束。一旦一个应用程序返回零,系统就会停止发送WM_QUERYENDSESSION消息。
处理完此消息后,系统会发送WM_ENDSESSION消息,并将wParam参数设置为WM_QUERYENDSESSION消息的结果。