查看完整版本: [-- 超级简便的 Qt 读写 INI 配置方案 --]

QTCN开发网 -> Qt代码秀 -> 超级简便的 Qt 读写 INI 配置方案 [打印本页] 登录 -> 注册 -> 回复主题 -> 发表主题

姜小白 2020-08-23 23:30

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

INI 文件作为最常用的配置文件之一,经常出现在各种程序中。
在效率第一的现在,如何能方便简洁并高效的搞定这些数据读写?

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

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

使用效果如下图:
[attachment=21860]



使用方式如下:
1、定义 INI 配置文件方式
  1. // 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、使用方式如下
  1. #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"实现如下
  1. #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 实现的,比如:
  1. #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]

nigoole 2020-08-24 08:39
   好久不见大佬身影了,甚是想念啊!

姜小白 2020-08-24 10:06
nigoole:[表情]  [表情] 好久不见大佬身影了,甚是想念啊! (2020-08-24 08:39) 

久违了,倪兄!

遨游的小鱼 2020-08-29 16:08
这种比读写xml会快很多吗?

boylebao 2020-09-02 09:34
我觉得用我这种方法也挺香的,Qt编写一款快速生成 QSettings 代码的应用|http://www.qtcn.org/bbs/read-htm-tid-88586.html

qm3234 2020-09-04 13:04

programmerhz 2020-09-11 08:55

f12x45q56 2020-11-26 11:14
楼主牛逼厉害了

yanlingzhen 2021-04-25 06:51
不错,不错。。。。

zipl1985 2022-07-23 12:16
学习了,谢谢。。


查看完整版本: [-- 超级简便的 Qt 读写 INI 配置方案 --] [-- top --]



Powered by phpwind v8.7 Code ©2003-2011 phpwind
Gzip disabled