QApplication :: saveState и QApplication :: commitData в Windows - PullRequest
2 голосов
/ 29 ноября 2011

Когда виртуальные функции QApplication::saveState и QApplication::commitData вызываются на Windows ? Они вообще называются или управление сессиями - это просто UNIX? Они вызываются, если приложение работает, когда пользователь выходит из системы (и приложение принудительно закрывается)?

Ответы [ 2 ]

4 голосов
/ 30 ноября 2011

Я написал простое тестовое приложение;увидеть ниже.Я скомпилировал приложение с Qt 4.7 и MSVS 2010 и запустил его на 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";
    }
}
2 голосов
/ 30 ноября 2011

Из документации:

Получение управления сессиями для работы с Qt

Начните с повторной реализации QApplication :: commitData (), чтобы позволить вашему приложению принять участие в процессе постепенного выхода из системы.,Если вы ориентируетесь только на платформу Microsoft Windows, это all , которую вы можете и должны предоставить.(выделение добавлено)

commitData () вызывается , когда приложение Windows получает сообщение Windows WM_QUERYENDSESSION .

Из документов WM_QUERYENDSESSION:

Сообщение WM_QUERYENDSESSION отправляется, когда пользователь решает завершить сеанс или когда приложение вызывает одну из функций завершения работы системы.Если какое-либо приложение возвращает ноль, сеанс не заканчивается.Система прекращает отправку сообщений WM_QUERYENDSESSION, как только одно приложение возвращает ноль.

После обработки этого сообщения система отправляет сообщение WM_ENDSESSION с параметром wParam, установленным на результаты сообщения WM_QUERYENDSESSION.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...