#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/

10-12 20:41