• 4572阅读
  • 16回复

Qt编写一款快速生成 QSettings 代码的应用 [复制链接]

上一主题 下一主题
离线boylebao
 

图酷模式  只看楼主 倒序阅读 楼主  发表于: 2020-04-27
     在实际开发中需要使用QSetting 保存配置文件的频率特别多。在敲写了一堆 settings.setValue("key",value); 之后,总要,再敲一堆 value = settings.value("key",value).value<type>();  往往感到无趣,所以是时候改变一下工作的方式了。
     首先,QSettings 保存的多数是变量的值,举个栗子:


     代码在Github


声明了以下变量:
  1. QString mName; //名字
  2. ushort mAge; //年龄
  3. ushort mA,mB,mC; //三围
  4. ushort mHeight; //身高
  5. int mTemp;
  6. float mXxx;
  7. double mBug;
        那么我们可以对这样的变量声明进行解析,让他快速生成QSettings 的setValue 和value 语句。
  1. auto path = QString("");
  2. QSettings settings(path);
  3. settings.setIniCodec("UTF-8");
  4. settings.beginGroup("config");
  5. settings.setValue("Name",mName); //名字
  6. settings.setValue("Age",mAge); //年龄
  7. settings.setValue("A",mA); //三围
  8. settings.setValue("B",mB); //三围
  9. settings.setValue("C",mC); //三围
  10. settings.setValue("Height",mHeight); //身高
  11. settings.setValue("Temp",mTemp);
  12. settings.setValue("Xxx",mXxx);
  13. settings.setValue("Bug",mBug);
  14. settings.endGroup();
  1. auto path = QString("");
  2. QSettings settings(path);
  3. settings.setIniCodec("UTF-8");
  4. settings.beginGroup("config");
  5. mName = settings.value("Name",mName).value<QString>(); //名字
  6. mAge = settings.value("Age",mAge).value<ushort>(); //年龄
  7. mA = settings.value("A",mA).value<ushort>(); //三围
  8. mB = settings.value("B",mB).value<ushort>(); //三围
  9. mC = settings.value("C",mC).value<ushort>(); //三围
  10. mHeight = settings.value("Height",mHeight).value<ushort>(); //身高
  11. mTemp = settings.value("Temp",mTemp).value<int>();
  12. mXxx = settings.value("Xxx",mXxx).value<float>();
  13. mBug = settings.value("Bug",mBug).value<double>();
  14. settings.endGroup();


大概的界面就是这样的;

支持基本的数据类型,还支持结构体,复杂的未考虑。






最后,这样的功能大家喜欢吗?
喜欢就开源
不喜欢可以提点修改需求



8条评分好评度+2贡献值+2金钱+20威望+2
巫添良 好评度 +1 - 2020-05-29
巫添良 贡献值 +1 - 2020-05-29
巫添良 威望 +1 - 2020-05-29
巫添良 金钱 +10 - 2020-05-29
20091001753 好评度 +1 - 2020-04-28
20091001753 贡献值 +1 - 2020-04-28
20091001753 威望 +1 - 2020-04-28
20091001753 金钱 +10 - 2020-04-28
为Qt打造具有强大生产力的软件。
离线lzh280

只看该作者 1楼 发表于: 2020-04-27
          
离线liudianwu

只看该作者 2楼 发表于: 2020-04-27
确实是个需求
欢迎关注微信公众号:Qt实战 (各种开源作品、经验整理、项目实战技巧,专注Qt/C++软件开发,视频监控、物联网、工业控制、嵌入式软件、国产化系统应用软件开发)QQ:517216493  WX:feiyangqingyun  QQ群:751439350
离线nigoole

只看该作者 3楼 发表于: 2020-04-27
可以放个exe出来体验先,有些效果测试后方能发现。
有句话说得好:好好学习,天天向上。加油~~!有上船的朋友联系企鹅393320854
离线lsyzsl

只看该作者 4楼 发表于: 2020-04-28
挺实用的,如果楼主没有收费的要求建议放到git上,以便功能扩展。
离线boylebao

只看该作者 5楼 发表于: 2020-04-28
回 liudianwu 的帖子
liudianwu:确实是个需求 (2020-04-27 16:41) 

为Qt打造具有强大生产力的软件。
离线boylebao

只看该作者 6楼 发表于: 2020-04-28
回 nigoole 的帖子
nigoole:可以放个exe出来体验先,有些效果测试后方能发现。[表情] [表情]  (2020-04-27 17:03) 

好的,待我整理放源码
为Qt打造具有强大生产力的软件。
离线boylebao

只看该作者 7楼 发表于: 2020-04-28
回 lsyzsl 的帖子
lsyzsl:挺实用的,如果楼主没有收费的要求建议放到git上,以便功能扩展。[表情]  (2020-04-28 09:15) 

好的,第一次使用github,花点时间学了就放在上面
为Qt打造具有强大生产力的软件。
离线boylebao

只看该作者 8楼 发表于: 2020-04-28
已放到github  
为Qt打造具有强大生产力的软件。
离线zxwmail

只看该作者 9楼 发表于: 2020-04-28
    
离线richards

只看该作者 10楼 发表于: 2020-04-29
这种外挂软件的方式 还不方便。 可以利用反射的功能 让这部分读取写入自动化
离线boylebao

只看该作者 11楼 发表于: 2020-04-29
回 richards 的帖子
richards:这种外挂软件的方式 还不方便。 可以利用反射的功能 让这部分读取写入自动化 (2020-04-29 14:18) 

反射的方式是什么呢?可以详细说明吗?
为Qt打造具有强大生产力的软件。
离线richards

只看该作者 12楼 发表于: 2020-05-24
回 boylebao 的帖子
boylebao:反射的方式是什么呢?可以详细说明吗? (2020-04-29 16:28) 

通过反射 比如 QObject 或者QGadget 里面 定义Property 的方式注册成员变量,这些成员变量 可以通过元对象系统去的 变量名称的字符串。也可以通过setproperty 这样的接口 通过字符串名称的方式来改变该变量的值。这样 你可以直接 通过解析字符串 或者 反过来把变量按照字符串名称 和 值的方式导出

请看 setProperty & property
离线boylebao

只看该作者 13楼 发表于: 2020-05-25
回 richards 的帖子
richards:通过反射 比如 QObject 或者QGadget 里面 定义Property 的方式注册成员变量,这些成员变量 可以通过元对象系统去的 变量名称的字符串。也可以通过setproperty 这样的接口 通过字符串名称的方式来改变该变量的值。这样 你可以直接 通过解析字符串 或者 反过来把变量按照字符串名称 .. (2020-05-24 20:15) 

这个setProperty & property我知道,这种方式只能当临时变量来用吧,如果遇到不是继续QObject的类来说,不能用这种方式的,我这个是针对QSettings 来保存变量值
为Qt打造具有强大生产力的软件。
离线richards

只看该作者 14楼 发表于: 2020-05-27
回 boylebao 的帖子
boylebao:这个setProperty & property我知道,这种方式只能当临时变量来用吧,如果遇到不是继续QObject的类来说,不能用这种方式的,我这个是针对QSettings 来保存变量值 (2020-05-25 11:28) 

QGadget 也可以有 不绝对是 QObject  。配合反射  QSetting  来读写最终的 文件。再入手 读取QSetting 自动 初始化对应的OBject。 写入的时候把Object 的值 写入到Setting的ini 文档里撒
离线richards

只看该作者 15楼 发表于: 2020-05-27

QJsonObject BaseConfig::toJsonObject() const
{
    QVariantMap map;
    const auto metaObject = this->metaObject();
    LOG() << metaObject->propertyOffset() << metaObject->propertyCount();
    for(int i = metaObject->propertyOffset();
        i < metaObject->propertyCount();i++)
    {
        auto pname = metaObject->property(i).name();
        LOG() << pname << ":" << this->property(pname) << metaObject->property(i).isEnumType();
        if(metaObject->property(i).isEnumType() == true) //枚举变量
        {
            auto tpname = metaObject->property(i).typeName();
            int index = BaseConfig::staticMetaObject.indexOfEnumerator(tpname);
            auto v = BaseConfig::staticMetaObject.enumerator(index).valueToKey(this->property(pname).toInt());
            map.insert(pname,v);
        }else
            map.insert(pname,this->property(pname));
    }

    return QJsonObject::fromVariantMap(map);
}

void BaseConfig::loadFromJsonObject(const QJsonObject &jobj)
{
    QVariantMap map = jobj.toVariantMap();
    for(auto p:map.keys())
    {
        QVariant v = map.value(p);
        LOG() << this->setProperty(p.toLatin1(),v) << p << v;

    }
}
离线boylebao

只看该作者 16楼 发表于: 2020-05-27
回 richards 的帖子
richards:QJsonObject BaseConfig::toJsonObject() const
{
    QVariantMap map;
    const auto metaObject = this->metaObject();
....... (2020-05-27 00:14) 

首先十分感谢您的指导,我需要点时间学习下
为Qt打造具有强大生产力的软件。
快速回复
限100 字节
 
上一个 下一个