硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2315|回复: 2
收起左侧

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

[复制链接]

31

主题

208

回帖

301

积分

高级会员

积分
301
发表于 2020-10-12 11:33:36 | 显示全部楼层 |阅读模式
原创来自  一位大侠
http://www.qtcn.org/bbs/read-htm-tid-88919.html

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

亲试好用!


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









回复

使用道具 举报

31

主题

208

回帖

301

积分

高级会员

积分
301
 楼主| 发表于 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;
回复

使用道具 举报

334

主题

2032

回帖

3039

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3039
发表于 2020-10-16 09:34:42 | 显示全部楼层
这是C语言的 吗,我怎么看不懂。。。。。用QSettings这个标准类不好吗?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-6 02:16 , Processed in 0.179558 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表