• 7209阅读
  • 9回复

超级简便的 Qt 读写 INI 配置方案 [复制链接]

上一主题 下一主题
离线姜小白
 

只看楼主 倒序阅读 楼主  发表于: 2020-08-23
INI 文件作为最常用的配置文件之一,经常出现在各种程序中。
在效率第一的现在,如何能方便简洁并高效的搞定这些数据读写?

本文将会分享一份关于 Qt 的方案。(有兴趣的小伙伴可以在此基础知识轻松扩展)

这篇文章中涉及到的头文件之一,命名为:"inier.h"

使用效果如下图:




使用方式如下:
1、定义 INI 配置文件方式
  1. // datIni.h 文件
  2. #include "inier.h"                              // 本文将要实现的
  3. // 加载定义 INI 文件开始
  4. INI_BEGIN("./dat.ini")                          // 操作的文件路径
  5. // user 段
  6. INI_PARAM(user, QString, Name, "Ann")           // 依次是:段名,数据类型,数据名称,默认值
  7. INI_PARAM(user, QString, Power, "123456")
  8. INI_PARAM(user, int, Authority, 1)
  9. // test 段
  10. INI_PARAM(test, int, Num, 15)
  11. INI_PARAM(test, double, Tem, 86.3)
  12. INI_PARAM(test, bool, IsOk, true)
  13. ...  // 添加各种需要的数据
  14. // 加载定义 INI 文件结束
  15. INI_END

2、使用方式如下
  1. #include <QApplication>
  2. #include "logger.h"
  3. #include "datIni.h"  // 上面定义的头文件
  4. int main(int argc, char **argv)
  5. {
  6.     QApplication app(argc, argv);
  7.     // get 对应的参数,并打印
  8.     logDebug(ini.getName(), ini.getPower(), ini.getAuthority(), ini.getNum(), ini.getTem(), ini.getIsOk());
  9.     // set 参数
  10.     ini.setName("Judi");
  11.     ini.setPower("admin");
  12.     ini.setTem(63.5);
  13.     ini.setIsOk(false);
  14.     // get 对应的参数,并打印
  15.     logDebug(ini.getName(), ini.getPower(), ini.getAuthority(), ini.getNum(), ini.getTem(), ini.getIsOk());
  16.     return 0;
  17. }


3、头文件"inier.h"实现如下
  1. #ifndef INIER_H
  2. #define INIER_H
  3. #include <QSettings>
  4. #include <QString>
  5. // 单实例类宏实现方式
  6. #define Singleton(ClassName) \
  7. static ClassName &instance() {\
  8. static ClassName *m_instance = 0;\
  9. if (m_instance == 0)\
  10.     m_instance = new ClassName;\
  11.     return *m_instance;\
  12. }
  13. #define INI_BEGIN(FileName) \
  14. class Inier {\
  15. public:\
  16.     Singleton(Inier)\
  17. private:\
  18.     Inier() {\
  19.         m_setter = new QSettings(FileName, QSettings::IniFormat);\
  20.         QStringList keys = m_setter->allKeys();\
  21.         foreach (QString key, keys) m_mapVals.insert(key, m_setter->value(key));\
  22.     }\
  23.     ~Inier() {delete m_setter;}\
  24. public:
  25. #define INI_PARAM(Section, Type, Name, DefaultVal)\
  26. Type get##Name() const { return m_mapVals.value(#Section"/"#Name, DefaultVal).value<Type>(); }\
  27. void set##Name(const Type &Name) {\
  28.     Type val = get##Name();\
  29.     if (val == Name) return;\
  30.     val = Name;\
  31.     m_mapVals.insert(#Section"/"#Name, Name);\
  32.     setValue(#Section"/"#Name, Name);\
  33. }
  34. #define INI_END \
  35.     void setValue(const QString &name, const QVariant &val) { m_setter->setValue(name, val); m_setter->sync(); }\
  36.     QVariant value(const QString &name, const QVariant &defaultVal) { return m_setter->value(name, defaultVal); }\
  37. private:\
  38.     QSettings *m_setter;\
  39.     QMap<QString, QVariant> m_mapVals;\
  40. };
  41. #define ini Inier::instance()
  42. #endif // INIER_H




4、个人习惯问题
如果有觉得驼峰命名不习惯的小伙伴可以自己修改 INI_PARAM 实现的,比如:
  1. #define INI_PARAM(Section, Type, Name, DefaultVal)\
  2. Type get_##Name() const { return m_mapVals.value(#Section"/"#Name, DefaultVal).value<Type>(); }\
  3. void set_##Name(const Type &Name) {\
  4. Type val = get_##Name();\
  5. if (val == Name) return;\
  6. val = Name;\
  7. m_mapVals.insert(#Section"/"#Name, Name);\
  8. setValue(#Section"/"#Name, Name);\
  9. }
这样定义的时候,变量名就可以不必大写
INI_PARAM(user, QString, name, "Ann")
使用时就变成:
ini.get_name();
ini.set_name("xxxx");


5、下期预告
下一章将讲里面用到的 logDebug 的日志输出实现!
效果如下,敬请期待!
也可以通过下面的链接查看:
https://xiaozhuanlan.com/sorghum-cpp?rel=sorghum
5条评分好评度+2贡献值+1金钱+10威望+1
20091001753 好评度 +1 - 2020-08-25
20091001753 贡献值 +1 - 2020-08-25
20091001753 威望 +1 - 2020-08-25
20091001753 金钱 +10 - 2020-08-25
suzhuorui 好评度 +1 - 2020-08-24
我整理的一些文章,持续更新中,有兴趣的小伙伴可以关注。
https://xiaozhuanlan.com/sorghum-cpp?rel=sorghum

Qt技术交流:QQ2499971906
离线nigoole

只看该作者 1楼 发表于: 2020-08-24
   好久不见大佬身影了,甚是想念啊!
有句话说得好:好好学习,天天向上。加油~~!有上船的朋友联系企鹅393320854
离线姜小白

只看该作者 2楼 发表于: 2020-08-24
回 nigoole 的帖子
nigoole:[表情]  [表情] 好久不见大佬身影了,甚是想念啊! (2020-08-24 08:39) 

久违了,倪兄!
我整理的一些文章,持续更新中,有兴趣的小伙伴可以关注。
https://xiaozhuanlan.com/sorghum-cpp?rel=sorghum

Qt技术交流:QQ2499971906

只看该作者 3楼 发表于: 2020-08-29
这种比读写xml会快很多吗?
在线boylebao

只看该作者 4楼 发表于: 2020-09-02
我觉得用我这种方法也挺香的,Qt编写一款快速生成 QSettings 代码的应用|http://www.qtcn.org/bbs/read-htm-tid-88586.html
为Qt打造具有强大生产力的软件。
离线qm3234

只看该作者 5楼 发表于: 2020-09-04
离线programmerhz

只看该作者 6楼 发表于: 2020-09-11
离线f12x45q56

只看该作者 7楼 发表于: 2020-11-26
楼主牛逼厉害了
离线yanlingzhen

只看该作者 8楼 发表于: 2021-04-25
不错,不错。。。。
离线zipl1985

只看该作者 9楼 发表于: 2022-07-23
学习了,谢谢。。
快速回复
限100 字节
 
上一个 下一个