Обновить элемент в qvariantlist

Я немного запутался в QVariantMAP/List и справочнике.

Я загружаю json с помощью QJson и конвертирую его в QVariantMAP. currentJSON["тесты"] - это QVariantList

Я хочу просмотреть currentJSON["tests"] и обновить значение item["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();
}

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


person Jonathan Le Cornichone    schedule 27.07.2015    source источник
comment
QVariantMap test = hehe->toMap(); копирует значение. Попробуйте добавить *hehe = test; после изменения метки.   -  person Amartel    schedule 27.07.2015
comment
Спасибо, хорошая идея, но это не решает проблему :/   -  person Jonathan Le Cornichone    schedule 27.07.2015
comment
Если я удалю второй l = qvariant_cast‹QVariantList›(currentJSON[tests]); это сработало. Следовательно, qvariant_cast сделал копию, есть ли способ избежать этого?   -  person Jonathan Le Cornichone    schedule 27.07.2015


Ответы (1)


Хорошо, с помощью 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();
 }

Я добавил: *hehe = test; текущийJSON["тесты"] = л;

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

person Jonathan Le Cornichone    schedule 27.07.2015
comment
Is there a way to work with reference instead of copy ? - Сомневаюсь. QVariant сам по себе сложный контейнер. Он использует операторы потока для сериализации/десериализации значений, поэтому он не может вернуть вам ссылку. - person Amartel; 27.07.2015