Jef*_*eff 10 c++ qt qvariant qmap
#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();
}
Run Code Online (Sandbox Code Playgroud)
我试图在嵌套的QVariantMap中分配一个QVariant.第一个qDebug()不输出任何内容,但第二个输出"asdf"如预期的那样.如何将嵌套变量映射中的"bar"键分配给值?
RA.*_*RA. 12
问题是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();
}
Run Code Online (Sandbox Code Playgroud)
据推测,您希望修改现有地图而不是覆盖它.您可以通过复制现有地图,添加新数据(这将导致深层复制),然后将地图写回:
QVariantMap existingMap = qvariant_cast<QVariantMap>(map["foo"]);
existingMap["bar"] = "a";
map["foo"] = QVariant(existingMap);
Run Code Online (Sandbox Code Playgroud)
如果您正在考虑存储大量数据,您可能希望重新考虑使用QVariant.