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

时间:2011-11-29 15:35:14

标签: c++ windows qt

Windows 上调用虚拟函数QApplication::saveStateQApplication::commitData的时间是什么时候? 它们是否被调用,或者会话管理只是一个UNIX的东西? 如果用户退出时应用程序正在运行(并强行关闭应用程序),是否会调用它们?

2 个答案:

答案 0 :(得分:4)

我写了一个简单的测试应用程序;见下文。我用Qt 4.7和MSVS 2010编译了应用程序并在Windows XP上运行它。然后我跑了三个不同的测试:

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

    • 仅在案例3中调用QApplication :: commitData
    • 在三种情况中都不会调用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";
        }
    }
    

答案 1 :(得分:2)

来自文档:

  

使会话管理与Qt一起使用

     

首先重新实现QApplication :: commitData()以使您的应用程序能够参与正常的注销过程。如果您只定位到Microsoft Windows平台,那么 (重点补充)

当Windows应用程序收到commitData() is called窗口消息时,

WM_QUERYENDSESSION

来自WM_QUERYENDSESSION文档:

  

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

     

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

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