-
UID:164304
-
- 注册时间2015-07-21
- 最后登录2020-10-05
- 在线时间381小时
-
- 发帖129
- 搜Ta的帖子
- 精华1
- 金钱3056
- 威望150
- 贡献值10
- 好评度144
-
访问TA的空间加好友用道具
|
INI 文件作为最常用的配置文件之一,经常出现在各种程序中。 在效率第一的现在,如何能方便简洁并高效的搞定这些 数据读写? 本文将会分享一份关于 Qt 的方案。(有兴趣的小伙伴可以在此基础知识轻松扩展) 这篇文章中涉及到的头文件之一,命名为:"inier.h"。 使用效果如下图: 使用方式如下: 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
|