QApplication::saveState and QApplication::commitData on Wind

QApplication::saveState and QApplication::commitData on Windows

本文关键字:QApplication Wind on and saveState commitData      更新时间:2023-10-16

Windows上何时调用虚函数QApplication::saveStateQApplication::commitData ?它们是否被调用,或者会话管理只是UNIX的东西?如果用户注销时应用程序正在运行(并且应用程序被强制关闭),它们是否被调用?

我写了一个简单的测试应用;见下文。我用Qt 4.7和msvs2010编译了这款应用,并在Windows XP上运行。然后我做了三个不同的测试:

  1. 启动应用程序。使用主窗口中的关闭按钮终止应用程序。
  2. 启动应用程序。在任务管理器中使用结束任务终止应用程序。
  3. 启动应用程序,在应用程序运行时退出。

检查结果:

  • QApplication::commitData只在情况3
  • 时调用
  • QApplication::saveState在这三种情况下都没有被调用。

下面是测试应用的代码。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";
    }
}

来自文档:

让会话管理与Qt一起工作

首先重新实现QApplication::commitData(),使您的应用程序能够参与优雅的注销过程。如果您只针对Microsoft Windows平台,这是可以必须提供的所有。(强调)

commitData()在windows应用程序接收到WM_QUERYENDSESSION windows消息时被调用。

来自WM_QUERYENDSESSION文档:

WM_QUERYENDSESSION消息在用户选择结束会话或应用程序调用系统关闭函数之一时发送。如果任何应用程序返回零,则会话未结束。一旦有一个应用程序返回0,系统就会停止发送WM_QUERYENDSESSION消息。

系统处理完此消息后,发送WM_ENDSESSION消息,wParam参数设置为WM_QUERYENDSESSION消息的结果。

http://doc.qt.nokia.com/latest/qapplication.html commitData