c++ - 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 为根。)
解决方案
进行所需的更改后,您需要返回树并使用新数据更新变量。
// 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 转换回数据并从那里更新源文档。
推荐阅读
- android - 接收广播意图时出错 (act=com.google.android.gms.auth.phone.SMS_RETRIEVED)
- python - 添加一个类别变量,为每条街道 10m 的每个路段提供唯一的 id
- python - Tensorflow 中 Flatten() 层中输入和输出形状的问题
- javascript - 使用带有哈希路由的后退按钮关闭模式
- darknet - 在没有 OpenCV 和 CUDA 的 Windows 10 上安装 Darknet(自己的设备上没有 GPU):问题
- azure - 是否有使 opencensus 与 MLFlow 一起使用的解决方法?
- ios - 如何在 Xcode 中直接更改 SVG 文件?
- wpf - 处理无法转换 WPF 中双属性的值
- javascript - 解析 html 字符串并在每个标题之前附加新的 div
- authentication - EMV 在 SDA/DDA/CDA 之间选择加密方法