C++ Windows上的QApplication::saveState和QApplication::commitData

C++ Windows上的QApplication::saveState和QApplication::commitData,c++,windows,qt,C++,Windows,Qt,在Windows上何时调用虚拟函数QApplication::saveState和QApplication::commitData? 它们到底是被调用的,还是会话管理只是UNIX的东西? 如果用户注销时应用程序正在运行(并且应用程序被强制关闭),是否调用它们?来自文档: 让会话管理与Qt协同工作 首先重新实现QApplication::commitData(),使您的应用程序能够参与正常的注销过程。如果您仅针对Microsoft Windows平台,则这是您所能提供且必须提供的全部功能。(增加重

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

来自文档:

让会话管理与Qt协同工作 首先重新实现QApplication::commitData(),使您的应用程序能够参与正常的注销过程。如果您仅针对Microsoft Windows平台,则这是您所能提供且必须提供的全部功能。(增加重点)

当windows应用程序收到windows消息时

从WM_QUERYENDSESSION文档:

WM_QUERYENDSESSION消息在用户选择结束会话或应用程序调用其中一个系统关闭功能时发送。如果任何应用程序返回零,则会话不会结束。一旦一个应用程序返回零,系统就会停止发送WM_QUERYENDSESSION消息

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


我写了一个简单的测试应用程序;见下文。我用Qt4.7和MSVS2010编译了这个应用程序,并在WindowsXP上运行。然后我运行了三个不同的测试:

  • 启动应用程序。使用主窗口中的关闭按钮终止应用程序
  • 启动应用程序。使用任务管理器中的结束任务终止应用程序
  • 启动应用程序。在应用程序运行时注销
  • 测试结果:

    • 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";
        }
    }
    
    #包括
    #包括
    #包括
    类MyApplication:公共QApplication{
    公众:
    MyApplication(int&argc,char**argv):QApplication(argc,argv){}
    虚拟无效存储状态(QSessionManager和manager)
    {
    std::ofs流(“SaveState.txt”);
    
    ofs阅读文档:您必须覆盖这些方法,实现您希望应用程序如何保存其已编辑的文档和/或状态,以及如何恢复它们。他们提供的是一个框架,而不是解决方案。如果您向我们展示您迄今为止的编码,我们可能会给您一些建议。我当然理解这一点为了使函数发挥任何作用,我必须在从QApplication派生的类中重写它们。但这不是我的问题。我的问题是“什么时候在Windows上调用虚拟函数QApplication::saveState和QApplication::commitData?”更具体地说“它们到底是被调用的,还是会话管理仅仅是UNIX的事情?”以及“如果用户注销时应用程序正在运行(并且应用程序被强制关闭),它们是否被调用?”?"Windows通常只支持退出时提示用户保存更改的
    commitData
    。如果应用程序崩溃或任务终止,则所有赌注都将关闭,除非您定期保存与MS Office类似的状态。Office等MFC样式的程序通常将其状态保存到注册表,您可以使用
    QSettings执行此操作对象。
    commitData
    在应用程序接收到主窗口的关闭事件时被调用,该事件在windows上为
    WM_close
    。您确实阅读了文档,因为我正在解释它。在许多情况下,不需要重新实现QApplication::commitData()。默认实现向所有顶级窗口发送关闭事件。对于大多数应用程序,这将触发正常关闭。许多应用程序在正常关闭期间保存其状态。如果是这种情况,则默认实现就是您所需要的。