什么时候在Windows上调用虚拟函数QApplication::saveState和QApplication::commitData?它们是被调用的,还是会话管理仅仅是UNIX的事情?当用户登录时,如果应用程序正在运行,它们会被调用(并且应用程序被强制关闭)?
发布于 2011-11-29 23:33:04
从文件中:
让会话管理与Qt一起工作 从重新实现QApplication::commitData()开始,使应用程序能够参与优雅的注销过程。如果您只针对Microsoft平台,这就是您可以并必须提供的全部内容。(强调后加)
commitData()被调用当windows应用程序接收到奎尔扬 windows消息时。
来自WM_QUERYENDSESSION文档:
当用户选择结束会话或应用程序调用系统关闭函数之一时,就会发送WM_QUERYENDSESSION消息。如果任何应用程序返回零,则会话不会结束。一旦一个应用程序返回零,系统就停止发送WM_QUERYENDSESSION消息。 在处理此消息之后,系统将WM_ENDSESSION消息与wParam参数设置为WM_QUERYENDSESSION消息的结果。
http://doc.qt.nokia.com/latest/qapplication.html#commitData
发布于 2011-11-30 11:20:28
我编写了一个简单的测试应用程序,如下所示。我用QT4.7和MSVS 2010编译了这个应用程序,并在Windows上运行。然后我做了三个不同的测试:
测试结果:
下面是测试应用程序的代码。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";
}
}https://stackoverflow.com/questions/8313471
复制相似问题