QApplication::saveState and QApplication::commitData on Wind
QApplication::saveState and QApplication::commitData on Windows
在Windows上何时调用虚函数QApplication::saveState
和QApplication::commitData
?它们是否被调用,或者会话管理只是UNIX的东西?如果用户注销时应用程序正在运行(并且应用程序被强制关闭),它们是否被调用?
我写了一个简单的测试应用;见下文。我用Qt 4.7和msvs2010编译了这款应用,并在Windows XP上运行。然后我做了三个不同的测试:
- 启动应用程序。使用主窗口中的关闭按钮终止应用程序。
- 启动应用程序。在任务管理器中使用结束任务终止应用程序。
- 启动应用程序,在应用程序运行时退出。
检查结果:
- 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
相关文章:
- 在Windows 10上使用Visual Studio 2019构建的Tesseract API c ++程序在Wind
- 我在使用 boost::serialization 时遇到了一个问题,我的代码在 Linux 中运行良好,但在 Wind
- 从插槽调用 QApplication::p rocessEvents 会导致再次调用同一插槽
- 如何在QApplication中应用QLibraryInfo中加载的库和插件配置
- 如何为应用程序中的某些按钮重置QApplication::styleSheet?
- QApplication::p rocessEvents 在不同的线程上
- 在运行时将更改的环境变量应用于 QApplication
- 如何声明从 QApplication 派生的 Qt 类并覆盖通知函数?
- 如何"Re-Polish"相同风格的QApplication?
- QT和新的信号槽语法,QApplication::退出主功能外的插槽
- QT 5 [ 错误: QtGui/QApplication: 没有这样的文件或目录]
- 使用带有 QApplication 的视觉检漏仪
- Qt5 对'QApplication::QApplication(int&, char**, int)'的未定义引用
- Qt/Qml - 触发 QApplication/QQmlApplicationEngine 事件(键和鼠标事件)
- 模仿 QApplication::p alette() 基于颜色样式的行为
- 完全删除 QApplication 实例并在另一个线程中重新创建它
- 将 argc 和 argv 传递给 QApplication 到单元测试用例方法中
- 创建真正的无头 QApplication 实例
- Qapplication中没有成员ARGC和ARGV
- QApplication::saveState and QApplication::commitData on Wind