1.应用程序在运行后都有一个初始化的状态
- 一般而言:程序的初始状态是最近一次运行退出前的状态
如何保存和恢复程序状态?
2.状态参数的存储方式
- 文本文件格式(xml、json等)
- 轻量级数据库(Access、SQLite)
- 私有二进制文件格式
Qt中的解决方案:
通过二进制数据流将状态参数直接存储在文件中
优势:
(1)参数的存储和读取简单高效,易于编码实现
(2)最终文件为二进制格式,不易被恶意修改
AppConfig.h
#ifndef APPCONFIG_H
#define APPCONFIG_H
#include <QObject>
#include <QFont>
class AppConfig : public QObject
{
Q_OBJECT
QFont m_editorFont; //编辑器字体
bool m_isAutoWrap; //是否自动换行
bool m_isToolBarVisible; //工具栏是否可见
bool m_isStatusBarVisible; //状态栏是否可见
bool m_isValid; //配置是否有效
bool restore(); //读取配置
public:
explicit AppConfig(QObject *parent = 0); //创建一个代表历史配置的对象,读取状态参数
explicit AppConfig(QFont font, bool isWrap, bool tbVisible, bool sbVisible, QObject *parent = 0); //创建一个代表当前配置的对象,存取当前状态
bool store(); //保存配置到文件中
QFont editorFont();
bool isAutoWrap();
bool isToolBarVisible();
bool isStatusBarVisible();
bool isValid();
signals:
};
#endif // APPCONFIG_H
AppConfig.cpp
#include "AppConfig.h"
#include <QFile>
#include <QDataStream>
#include <QApplication>
AppConfig::AppConfig(QObject *parent) : QObject{parent}
{
m_isValid = restore();
}
AppConfig::AppConfig(QFont font, bool isWrap, bool tbVisible, bool sbVisible, QObject *parent)
{
m_editorFont = font;
m_isAutoWrap = isWrap;
m_isToolBarVisible = tbVisible;
m_isStatusBarVisible = sbVisible;
m_isValid = true;
}
bool AppConfig::restore()
{
bool ret = true;
QFile file(QApplication::applicationDirPath() + "/app.config");
if( file.open(QIODevice::ReadOnly) )
{
QDataStream in(&file);
in.setVersion(QDataStream::Qt_5_15);
in >> m_editorFont;
in >> m_isAutoWrap;
in >> m_isToolBarVisible;
in >> m_isStatusBarVisible;
file.close();
}
else
{
ret = false;
}
return ret;
}
bool AppConfig::store()
{
bool ret = true;
QFile file(QApplication::applicationDirPath() + "/app.config");
if( file.open(QIODevice::WriteOnly) )
{
QDataStream out(&file);
out.setVersion(QDataStream::Qt_5_15);
out << m_editorFont;
out << m_isAutoWrap;
out << m_isToolBarVisible;
out << m_isStatusBarVisible;
file.close();
}
else
{
ret = false;
}
return ret;
}
QFont AppConfig::editorFont()
{
return m_editorFont;
}
bool AppConfig::isAutoWrap()
{
return m_isAutoWrap;
}
bool AppConfig::isToolBarVisible()
{
return m_isToolBarVisible;
}
bool AppConfig::isStatusBarVisible()
{
return m_isStatusBarVisible;
}
bool AppConfig::isValid()
{
return m_isValid;
}