首页 > 解决方案 > QT:具有 QVariant 的任意复杂数据结构

问题描述

引用 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 为根。)

标签: c++qt

解决方案


进行所需的更改后,您需要返回树并使用新数据更新变量。

// 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 转换回数据并从那里更新源文档。


推荐阅读