姜小白 |
2020-08-23 23:30 |
超级简便的 Qt 读写 INI 配置方案
INI 文件作为最常用的配置文件之一,经常出现在各种程序中。 在效率第一的现在,如何能方便简洁并高效的搞定这些数据读写? 本文将会分享一份关于 Qt 的方案。(有兴趣的小伙伴可以在此基础知识轻松扩展) 这篇文章中涉及到的头文件之一,命名为:"inier.h"。 使用效果如下图: [attachment=21860] 使用方式如下: 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 <QApplication>
#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 <QSettings> #include <QString>
// 单实例类宏实现方式 #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<Type>(); }\ 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<Type>(); }\ 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"); 5、下期预告 下一章将讲里面用到的 logDebug 的日志输出实现! 效果如下,敬请期待! 也可以通过下面的链接查看: https://xiaozhuanlan.com/sorghum-cpp?rel=sorghum [attachment=21861] |
|