超级简便的 Qt 读写 INI 配置方案

444 阅读2分钟

超级简便的 Qt 读写 INI 配置方案

INI 文件作为最常用的配置文件之一,经常出现在各种程序中。 在效率第一的现在,如何能方便简洁并高效的搞定这些数据读写? 本文将会分享一份关于 Qt 的方案。(有兴趣的小伙伴可以在此基础知识轻松扩展) 这篇文章中涉及到的头文件之一,命名为:"inier.h"。

| 使用效果如下图: | 92_164304_95d1f54749335b0.png

1、定义 INI 配置文件方式

// datIni.h 文件

#include "inier.h" // 本文将要实现的 // 加载定义 INI 文件开始 INI_BEGIN("./dat.ini") // 操作的文件路径 // user 段 INI_PARAM(user, QString, Name, "Ann") // 依次是:段名,数据类型,数据名称,默认值 INI_PARAM(user, QString, Power, "123456") INI_PARAM(user, int, Authority, 1) // test 段 INI_PARAM(test, int, Num, 15) INI_PARAM(test, double, Tem, 86.3) INI_PARAM(test, bool, IsOk, true) ... // 添加各种需要的数据 // 加载定义 INI 文件结束 INI_END

2、使用方式如下

#include #include "logger.h" #include "datIni.h" // 上面定义的头文件

int main(int argc, char **argv) { QApplication app(argc, argv); // get 对应的参数,并打印 logDebug(ini.getName(), ini.getPower(), ini.getAuthority(), ini.getNum(), ini.getTem(), ini.getIsOk()); // set 参数 ini.setName("Judi"); ini.setPower("admin"); ini.setTem(63.5); ini.setIsOk(false); // get 对应的参数,并打印 logDebug(ini.getName(), ini.getPower(), ini.getAuthority(), ini.getNum(), ini.getTem(), ini.getIsOk()); return 0; }

3、头文件"inier.h"实现如下

#ifndef INIER_H #define INIER_H

#include #include

// 单实例类宏实现方式 #define Singleton(ClassName)
static ClassName &instance() {
static ClassName *m_instance = 0;
if (m_instance == 0)
m_instance = new ClassName;
return *m_instance;
}

#define INI_BEGIN(FileName)
class Inier {
public:
Singleton(Inier)
private:
Inier() {
m_setter = new QSettings(FileName, QSettings::IniFormat);
QStringList keys = m_setter->allKeys();
foreach (QString key, keys) m_mapVals.insert(key, m_setter->value(key));
}
~Inier() {delete m_setter;}
public:

#define INI_PARAM(Section, Type, Name, DefaultVal)
Type get##Name() const { return m_mapVals.value(#Section"/"#Name, DefaultVal).value(); }
void set##Name(const Type &Name) {
Type val = get##Name();
if (val == Name) return;
val = Name;
m_mapVals.insert(#Section"/"#Name, Name);
setValue(#Section"/"#Name, Name);
}

#define INI_END
void setValue(const QString &name, const QVariant &val) { m_setter->setValue(name, val); m_setter->sync(); }
QVariant value(const QString &name, const QVariant &defaultVal) { return m_setter->value(name, defaultVal); }
private:
QSettings *m_setter;
QMap<QString, QVariant> m_mapVals;
};

#define ini Inier::instance()

#endif // INIER_H

4、个人习惯问题

| 如果有觉得驼峰命名不习惯的小伙伴可以自己修改 INI_PARAM 实现的,比如: |

#define INI_PARAM(Section, Type, Name, DefaultVal)
Type get_##Name() const { return m_mapVals.value(#Section"/"#Name, DefaultVal).value(); }
void set_##Name(const Type &Name) {
Type val = get_##Name();
if (val == Name) return;
val = Name;
m_mapVals.insert(#Section"/"#Name, Name);
setValue(#Section"/"#Name, Name);
}

这样定义的时候,变量名就可以不必大写 INI_PARAM(user, QString, name, "Ann") 使用时就变成: ini.get_name(); ini.set_name("xxxx");