C++ 从非有序数据构建QVariant列表

C++ 从非有序数据构建QVariant列表,c++,qt,qt5,qvariant,C++,Qt,Qt5,Qvariant,我有这组数据: [ step:-1, name:"BaseName1", value:v1 ] [ step:-1, name:"BaseName2", value:v2 ] [ step:2, name:"ParamName3", value:v3 ] [ step:2, name:"ParamName4", value:v4 ] [ step:0, name:"ParamName5", value:v5 ] [ step:0, name:"ParamName6", value:v

我有这组数据:

[ step:-1, name:"BaseName1",  value:v1 ]
[ step:-1, name:"BaseName2",  value:v2 ]
[ step:2,  name:"ParamName3", value:v3 ]
[ step:2,  name:"ParamName4", value:v4 ]
[ step:0,  name:"ParamName5", value:v5 ]
[ step:0,  name:"ParamName6", value:v6 ]
[ step:1,  name:"ParamName7", value:v7 ]
[ step:1,  name:"ParamName8", value:v8 ]
我想将其转换为QVariant,如下所示:

[
    "BaseName1": v1,
    "BaseName2": v2,
    "steps": [{
            "ParamName5": v5,
            "ParamName6": v6
        }, {
            "ParamName7": v7,
            "ParamName8": v8
        }, {
            "ParamName3": v3,
            "ParamName4": v4
        }
    ]
]
QVariantMap params;
params["Base_param_1"] = value;
params["Base_param_2"] = value2;
params["steps"] = QVariantList();
我想应该是这样的:

[
    "BaseName1": v1,
    "BaseName2": v2,
    "steps": [{
            "ParamName5": v5,
            "ParamName6": v6
        }, {
            "ParamName7": v7,
            "ParamName8": v8
        }, {
            "ParamName3": v3,
            "ParamName4": v4
        }
    ]
]
QVariantMap params;
params["Base_param_1"] = value;
params["Base_param_2"] = value2;
params["steps"] = QVariantList();
但是对于数组,我需要对数据进行排序;这意味着我应该在步骤1和3之前的
params[“steps”]
中插入步骤0(步骤2应该是空的)。
此外,对输入数据进行排序也不是一个选项

我尝试用以下代码实现此功能:

struct Params{ 
    QString name;  
    QVariant value; 
    int step;/* -1 for base param */ 
};
QList<Params> _params = (...);

QVariantMap v_settings;
QVariantList v_steps;

for(int i=0; i<_params.size(); i++){
    const Param &param = _params[i];

    if( param.index == -1 ){
        v_settings.insert(param.name, param.value);
    }
    else {
        // if list too small, append empties to the list until it exists
        while( v_steps.size() < param.index ){
            QVariantMap map;
            v_steps.append(map);
        }

        v_steps.at(param.index).toMap().insert(param.name, param.value);
    }
}
v_settings.insert("steps", v_steps);
v_steps[param.index].insert(param.name, param.value);
所以我猜我的“用空地图填充”循环以某种方式失败了。
在这里我应该怎么做?

您的代码中有几个问题

“索引超出范围”问题的发生是因为您没有向列表中添加足够的对象。你应该写

while( v_steps.size() <= param.index ) {
然后需要将其转换为
QVariantList

QVariantList v_steps_real;
foreach(QVariantMap map, v_steps) {
  v_steps_real << map;
}
v_settings.insert("steps", v_steps_real);

代码中有几个问题

“索引超出范围”问题的发生是因为您没有向列表中添加足够的对象。你应该写

while( v_steps.size() <= param.index ) {
然后需要将其转换为
QVariantList

QVariantList v_steps_real;
foreach(QVariantMap map, v_steps) {
  v_steps_real << map;
}
v_settings.insert("steps", v_steps_real);

这就成功了,谢谢。我只是想知道为什么没有办法“就地”修改QtJson的数组内容。感觉。。。不完整。您可以执行类似于
QVariantMap=variant_list[i].toMap()的操作;映射[键]=值;变量列表[i]=地图-它将就地编辑QVariantMap。不过,这会造成一些开销。这就成功了,谢谢。我只是想知道为什么没有办法“就地”修改QtJson的数组内容。感觉。。。不完整。您可以执行类似于
QVariantMap=variant_list[i].toMap()的操作;映射[键]=值;变量列表[i]=地图-它将就地编辑QVariantMap。不过,这会导致一些开销。