QT: Произвольно сложные структуры данных с QVariant - PullRequest
0 голосов
/ 25 февраля 2019

Цитирование документов QT:

Вы даже можете хранить значения QList и QMap в одном варианте, так что вы можете легко создавать произвольно сложные структуры данных произвольных типов.Это очень мощный и универсальный инструмент, но он может оказаться менее эффективным с точки зрения памяти и скорости, чем при хранении определенных типов в стандартных структурах данных.

Кто-нибудь знает или имеет пример такого выполнения?

Я давний программист на C ++, но QT Nube и копия семантики записи дают мне припадки.Карты и списки структур данных QVariants кажутся неизменными.Каждый раз, когда я пытаюсь изменить дерево значений, я просто изменяю копию.


Получил отзыв от моего первого поста, в котором я должен добавить пример.Здесь идет:

// Input Data:
//
// { "f1"   : "field-1",
//   "list" : [ 0, 1, 2, 3, 4 ] }
//

// Convert the data, commented above, into a QVariantMap with two 
// values:
//  "f1"   - a string
//  "list" - a QVariantList of integers
QVariant vData = ConvertJsonDocument(document);

// Dump
qWarning( VariantToString(vData).toLocal8Bit() );

// Convert vData to QVariantMap
QVariantMap vMap = vData.value<QVariantMap>();
// Get the list of integers as a QVariantList
QVariantList vList = vMap["list"].value<QVariantList>();
// Change the 0 to a 5
vList[0] = 5;

// Dump
qWarning( VariantToString(vData).toLocal8Bit() );

Вывод сверху:

{ "f1" : "field-1", "list" : [ 0, 1, 2, 3, 4 ] }
{ "f1" : "field-1", "list" : [ 0, 1, 2, 3, 4 ] }

Желаемый вывод сверху:

{ "f1" : "field-1", "list" : [ 0, 1, 2, 3, 4 ] }
{ "f1" : "field-1", "list" : [ 5, 1, 2, 3, 4 ] }

Я получаю, что я изменяю копии, но дляжизнь моя, я не могу понять, как не надо.Как мне отредактировать исходные данные?(Данные в дереве имеют корни в vData.)

1 Ответ

0 голосов
/ 26 февраля 2019

После того, как вы сделаете желаемые изменения, вам нужно вернуться через дерево и обновить переменные новыми данными.

// Convert vData to QVariantMap
QVariantMap vMap = vData.value<QVariantMap>();
// Get the list of integers as a QVariantList
QVariantList vList = vMap["list"].value<QVariantList>();
// Change the 0 to a 5
vList[0] = 5;

// Change the map using insert, which replaces the value
vMap.insert("list", vList);
// Rebuild the QVariant from the QMap
vData = QVariant::fromValue(vMap);
// Dump
qWarning( VariantToString(vData).toLocal8Bit() );

Вы можете преобразовать данные обратно из QVariant и оттуда обновить исходный документ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...