2015-07-27 2 views
0

Я немного потерялся с QVariantMAP/List и reference.Обновить элемент в qvariantlist

Загрузите json с помощью QJson и преобразуйте его в QVariantMAP. currentJSON ["tests"] является QVariantList

Я хочу просмотреть currentJSON ["tests"] и обновить значение элемента ["label"]. Первый цикл попытается обновить значение, второе отобразит его. К сожалению, отображение значения не является обновленным значением. Я полагаю, что это проблема с копией/ссылкой, но я не могу ее исправить.

QVariantMap currentJSON = jObject.toVariantMap(); //jobject is the json 
QVariantList l = qvariant_cast<QVariantList>(currentJSON["tests"]); 
for (QVariantList::iterator hehe = l.begin(); hehe != l.end(); hehe++) { 
      QVariantMap test = hehe->toMap(); 
      test["label"].setValue(QVariant("AAAAAAAAAAAAAAAAAAA")); 
} 

l = qvariant_cast<QVariantList>(currentJSON["tests"]); 
for (QVariantList::iterator hehe = l.begin(); hehe != l.end(); hehe++) { 
      QVariantMap test = hehe->toMap(); 
      //the value print is not AAAAAAAAAAAAAAAAAAA 
      qDebug() << test["label"].toString(); 
} 

Если вы можете мне помочь, спасибо.

+0

'QVariantMap test = hehe-> toMap();' копирует значение. Попробуйте добавить '* hehe = test;' после "label" chane. – Amartel

+0

Спасибо и хорошая идея, но это не исправляет проблему:/ –

+0

Если я удалю второй «l = qvariant_cast (currentJSON [" tests "]); это сработало. Следовательно, qvariant_cast сделал копию, есть ли способ избежать этого? –

ответ

0

Хорошо, с помощью Amartel я нашел решение:

QVariantList l = qvariant_cast<QVariantList>(currentJSON["tests"]); 
for (QVariantList::iterator hehe = l.begin(); hehe != l.end(); hehe++) { 
      //qDebug() << hehe->toMap(); 
      QVariantMap test = hehe->toMap(); 
      test["label"].setValue(QVariant("AAAAAAAAAAAAAAAAAAA")); 
      *hehe = test; 
} 
currentJSON["tests"] = l; 

l = qvariant_cast<QVariantList>(currentJSON["tests"]); 
for (QVariantList::iterator hehe = l.begin(); hehe != l.end(); hehe++) { 
      QVariantMap test = hehe->toMap(); 
      qDebug() <<"y " << test["label"].toString(); 
} 

я добавил: * хе-хе = тест; currentJSON ["tests"] = l;

Но это немного сложно, если у меня много вложенных списков списков. Есть ли способ работать со ссылкой вместо копии?

+0

'Есть ли способ работать со ссылкой вместо копии?' - Сомневаюсь. 'QVariant' - сложный контейнер. Он использует операторы потока для сериализации/десериализации значений, поэтому он не может вернуть вам ссылку. – Amartel

+0

ОК спасибо за помощь –

Смежные вопросы