Qt/C++ QSettings——实现配置文件管理

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();
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值