查看完整版本: [-- Qt编写一款快速生成 QSettings 代码的应用 --]

QTCN开发网 -> Qt 作品展 -> Qt编写一款快速生成 QSettings 代码的应用 [打印本页] 登录 -> 注册 -> 回复主题 -> 发表主题

boylebao 2020-04-27 13:40

Qt编写一款快速生成 QSettings 代码的应用

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


     代码在Github


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


大概的界面就是这样的;
[attachment=21539]

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


[attachment=21541]


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




lzh280 2020-04-27 13:44
          

liudianwu 2020-04-27 16:41
确实是个需求

nigoole 2020-04-27 17:03
可以放个exe出来体验先,有些效果测试后方能发现。

lsyzsl 2020-04-28 09:15
挺实用的,如果楼主没有收费的要求建议放到git上,以便功能扩展。

boylebao 2020-04-28 09:49
liudianwu:确实是个需求 (2020-04-27 16:41) 


boylebao 2020-04-28 09:49
nigoole:可以放个exe出来体验先,有些效果测试后方能发现。[表情] [表情]  (2020-04-27 17:03) 

好的,待我整理放源码

boylebao 2020-04-28 09:50
lsyzsl:挺实用的,如果楼主没有收费的要求建议放到git上,以便功能扩展。[表情]  (2020-04-28 09:15) 

好的,第一次使用github,花点时间学了就放在上面

boylebao 2020-04-28 12:50
已放到github  

zxwmail 2020-04-28 15:07
    

richards 2020-04-29 14:18
这种外挂软件的方式 还不方便。 可以利用反射的功能 让这部分读取写入自动化

boylebao 2020-04-29 16:28
richards:这种外挂软件的方式 还不方便。 可以利用反射的功能 让这部分读取写入自动化 (2020-04-29 14:18) 

反射的方式是什么呢?可以详细说明吗?

richards 2020-05-24 20:15
boylebao:反射的方式是什么呢?可以详细说明吗? (2020-04-29 16:28) 

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

请看 setProperty & property

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

这个setProperty & property我知道,这种方式只能当临时变量来用吧,如果遇到不是继续QObject的类来说,不能用这种方式的,我这个是针对QSettings 来保存变量值

richards 2020-05-27 00:08
boylebao:这个setProperty & property我知道,这种方式只能当临时变量来用吧,如果遇到不是继续QObject的类来说,不能用这种方式的,我这个是针对QSettings 来保存变量值 (2020-05-25 11:28) 

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

richards 2020-05-27 00:14

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 2020-05-27 10:01
richards:QJsonObject BaseConfig::toJsonObject() const
{
    QVariantMap map;
    const auto metaObject = this->metaObject();
....... (2020-05-27 00:14) 

首先十分感谢您的指导,我需要点时间学习下


查看完整版本: [-- Qt编写一款快速生成 QSettings 代码的应用 --] [-- top --]



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