#include <QtCore/QCoreApplication>
#include <QVariant>
#include <QtDebug>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QVariantMap map;
map["foo"] = QVariant(QVariantMap());
map["baz"] = "asdf";
qvariant_cast<QVariantMap>(map["foo"])["bar"] = "a";
qDebug() << qvariant_cast<QVariantMap>(map["foo"])["bar"].toString();
qDebug() << map["baz"].toString();
return a.exec();
}
我正在尝试分配给嵌套QVariantMap中的QVariant。第一个qDebug()不输出任何内容,但是第二个按预期输出“asdf”。如何将嵌套变量映射中的“bar”键分配给一个值?
最佳答案
问题是qvariant_cast不会返回对其正在操作的QVariant内部的引用;它返回一个拷贝。这样,如果您用新的子映射覆盖顶级映射中的“foo”元素,则代码将正常工作:
#include <QtCore/QCoreApplication>
#include <QVariant>
#include <QtDebug>
int main(int argc, char** argv)
{
QCoreApplication a(argc, argv);
QVariantMap map;
map["foo"] = QVariant(QVariantMap());
map["baz"] = "asdf";
QVariantMap newMap;
newMap["bar"] = "a";
map["foo"] = QVariant(newMap);
qDebug() << qvariant_cast<QVariantMap>(map["foo"])["bar"].toString();
qDebug() << map["baz"].toString();
return a.exec();
}
大概是要修改现有 map ,而不是覆盖现有 map 。您可以通过复制现有 map ,添加新数据(这将导致深度复制),然后将 map 写回来完成此操作:
QVariantMap existingMap = qvariant_cast<QVariantMap>(map["foo"]);
existingMap["bar"] = "a";
map["foo"] = QVariant(existingMap);
如果您正在考虑存储大量数据,则不妨重新考虑对QVariant的使用。
关于c++ - 分配给嵌套的QVariantMap,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11090846/