Hp_2018 发表于 2020-10-12 11:33:36

超级简便的 Qt 读写 INI 配置方案(跨平台)-转发

原创来自一位大侠:victory::handshake
http://www.qtcn.org/bbs/read-htm-tid-88919.html

INI原本是 windows 下 的配置文件。 如果 Qt在Windows下使用 需要使用Windows家族的头文件,
这样 不能跨平台使用。 幸好一位 大侠 给出一个 简便 的方案 !

亲试好用!:victory:


使用方式如下:
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









Hp_2018 发表于 2020-10-12 11:44:43

本帖最后由 Hp_2018 于 2020-10-12 16:02 编辑

由于原文 没 有提供   logger.h, 可以修改 一下 main.cpp
红色是改成注释后的内容, 蓝色是 增加的内容。

    #include <QApplication>
    //   #include "logger.h"
    #include <QDebug>
    #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);

      qDebug()<<"Name" <<ini.getName();//
       qDebug()<<"Power" <<ini.getPower();//

      // get 对应的参数,并打印
       //    logDebug(ini.getName(), ini.getPower(), ini.getAuthority(), ini.getNum(), ini.getTem(), ini.getIsOk());
      return 0;

caicaptain2 发表于 2020-10-16 09:34:42

这是C语言的 吗,我怎么看不懂。。。。。用QSettings这个标准类不好吗?
页: [1]
查看完整版本: 超级简便的 Qt 读写 INI 配置方案(跨平台)-转发