我有这组数据:
[ 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();
但是对于数组,我需要对数据进行排序;这意味着我应该在步骤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 ¶m = _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.at(param.index).toMap().insert(param.name, param.value);
所以我想我的“用空 map 填充”循环以某种方式失败了。
我应该怎么办?
最佳答案
您的代码中有几个问题。
发生“索引超出范围”的问题是因为您没有将足够的对象添加到列表中。你应该写
while( v_steps.size() <= param.index ) {
即用
<
替换<=
。它将确保例如在您访问第5个元素之前,数组中将包含6个元素(元素从0开始计数,还记得吗?)另一个问题在
toMap().insert
中。 toMap()
按值(而不是引用)返回QMap
。因此,在其上调用insert
是没有意义的,因为它只是尚未分配给任何变量的临时值。 insert
结束后,它将立即被销毁,并且不会存储任何更改。我建议您使用
QVector<QVariantMap> v_steps
来存储数据。在这种情况下,QVector
比QList
更好,因为它很容易resize()
。可以使用以下代码完成插入:v_steps[param.index].insert(param.name, param.value);
然后,您需要将其转换为
QVariantList
:QVariantList v_steps_real;
foreach(QVariantMap map, v_steps) {
v_steps_real << map;
}
v_settings.insert("steps", v_steps_real);
请注意,您可以使用
[]
运算符代替insert()
将值插入 map :map["key"] = value;