Qt QSettings——实现配置文件管理。
说明
对配置文件的读取和写入进行
管理
。通过传入对应枚举值
进行读、写操作。
- 配置文件类型:
.ini
- 这样做的好处:
易于修改
、易于扩展
、单一职责
、可复用
等
用法
//用法测试
CIniMgr::getInstance()->read(IniItemType_1); //读取值
CIniMgr::getInstance()->write(IniItemType_1, "9527"); //写(更新)值
涉及到的类
- CiniMgr
- IniMgrBase
- QtIniBase
涉及到的文件
- IniItemDefine.h
- IniMgr.h
- IniMgr.cpp
- IniMgrBase.h
- IniMgrBase.cpp
- QtIniBase.h
- QtIniBase.cpp
具体代码
IniItemDefine.h
#pragma once
//配置对应的枚举值,自行修改
enum IniItemType
{
IniItemType_1 = 1,
IniItemType_2,
IniItemType_3
};
IniMgr.h
#pragma once
#include "IniMgrBase.h"
//配置管理类。单例类。继承IniMgrBase,只需实现父类的纯虚函数
class CIniMgr : public IniMgrBase
{
public:
static CIniMgr *getInstance();
protected:
void initGroupRelation() override; // !关注点
};
IniMgr.cpp
#include "IniMgr.h"
CIniMgr * CIniMgr::getInstance()
{
static CIniMgr *ptr_ = nullptr;
if (nullptr == ptr_)
{
ptr_ = new CIniMgr;
ptr_->init("initmap.ini"); // 传入配置文件名。也可传路径,如:xxx/xxx.ini 注意后缀为.ini
}
return ptr_;
}
/* 只需在这里对要使用的配置项进行配置 */
void CIniMgr::initGroupRelation()
{
//使用父类的insert方法,进行配置设置。
insert(IniItemType_1, "group1", "item1", "1000");
insert(IniItemType_3, "group1", "item2", "2000");
insert(IniItemType_2, "group2", "item3", "1");
}
IniMgrBase.h
#pragma once
#include <QMap>
#include "QtIniBase.h"
#include "IniItemDefine.h"
//配置管理基类。提供初始化、读配置、写配置功能。需要实现类实现初始化组关系的纯虚函数
class IniMgrBase
{
public:
void init(const QString &iniName);
QString read(IniItemType type);
void write(IniItemType type, QString val);
protected:
virtual void initGroupRelation() = 0;
QtIniBase* pIni();
void insert(IniItemType type, QString groupName, QString name, QString initVal);
QString getFlagName(QString groupName, QString name);
protected:
QMap<IniItemType, QString> m_intGroupMap;
QtIniBase *m_pIni = nullptr;
};
IniMgrBase.cpp
#include "IniMgrBase.h"
#include <QDebug>
QtIniBase* IniMgrBase::pIni()
{
return m_pIni;
}
void IniMgrBase::init(const QString &iniName)
{
if (!m_pIni)
{
m_pIni = QtIniBase::getInstance();
m_pIni->init(iniName);
initGroupRelation();
}
else {
qDebug()<<"配置文件管理器已经初始化,请勿重复设置!";
}
}
QString IniMgrBase::read(IniItemType type)
{
QString read_value;
auto iter = m_intGroupMap.find(type);
if (iter != m_intGroupMap.end())
{
auto flagName = iter.value();
auto value_ = m_pIni->readIni(flagName);
auto value = value_.toStdString();
read_value = value_;
}
return read_value;
}
void IniMgrBase::write(IniItemType type, QString val)
{
auto iter = m_intGroupMap.find(type);
if (iter != m_intGroupMap.end())
{
auto flagName = iter.value();
auto value_ = m_pIni->readIni(flagName);
m_pIni->writeIni(flagName, val);
}
}
void IniMgrBase::insert(IniItemType type, QString groupName, QString name, QString initVal)
{
auto flagName = getFlagName(groupName, name);
if (m_pIni->readIni(flagName).isEmpty())
{
m_pIni->writeIni(flagName, initVal);
m_intGroupMap.insert(type, flagName);
}
}
QString IniMgrBase::getFlagName(QString groupName, QString name)
{
return groupName + "/" + name;
}
QtIniBase.h
#pragma once
#include <QObject>
#include <QSettings>
class QtIniBase : public QObject
{
Q_OBJECT
public:
void init(QString path); // 初始设置配置文件名。外部调用.需在第一次使用时调用一次该函数
static QtIniBase *getInstance();
virtual ~QtIniBase();
void writeIni(QString key, QString val);//写
QString readIni(QString key);//读
private:
QString m_ini_path;
QSettings *m_settings = nullptr;
protected:
QtIniBase() = default;
QtIniBase(const QtIniBase&) = delete;
QtIniBase operator=(const QtIniBase&) = delete;
};
QtIniBase.cpp
#include "QtIniBase.h"
#include <string>
#include <iostream>
#include <QDebug>
QtIniBase* QtIniBase::getInstance()
{
static QtIniBase *ptr_ = nullptr;
if (nullptr == ptr_)
{
ptr_ = new QtIniBase();
}
return ptr_;
}
QtIniBase::~QtIniBase()
{
delete m_settings;
m_settings = nullptr;
}
void QtIniBase::init(QString path)
{
if (m_settings == nullptr)
{
m_ini_path = path;
m_settings = new QSettings(path, QSettings::IniFormat);
m_settings->setIniCodec("UTF-8");
return;
}
}
void QtIniBase::writeIni(QString key, QString val)
{
if (m_ini_path.isEmpty())
{
qDebug()<<"ini path is Empty,Please set ini path.";
return;
}
m_settings->setValue(key,val);
}
QString QtIniBase::readIni(QString key)
{
if (m_ini_path.isEmpty())
{
qDebug()<<"ini path is Empty,Please set ini path.";
return QString();
}
return m_settings->value(key).toString();
}