From b3f7bea10525a0b05a61f151f684b63d66488193 Mon Sep 17 00:00:00 2001 From: Allan Sandfeld Jensen Date: Mon, 10 Jul 2017 14:25:48 +0200 Subject: [PATCH] Handle conversion and comparison between qvarianthash and qvariantmap QVariant claims to be able to QVariantHash and QVariantMap, but the actual conversion implementation is missing. Task-number: QTBUG-61471 Change-Id: I0cba74642aa77dc423effed289bc7619922a89eb Reviewed-by: Thiago Macieira --- src/corelib/kernel/qvariant.cpp | 12 ++++++++++++ tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp | 8 ++++++++ 2 files changed, 20 insertions(+) diff --git a/src/corelib/kernel/qvariant.cpp b/src/corelib/kernel/qvariant.cpp index f114a84d22..e6262124fb 100644 --- a/src/corelib/kernel/qvariant.cpp +++ b/src/corelib/kernel/qvariant.cpp @@ -855,6 +855,12 @@ static bool convert(const QVariant::Private *d, int t, void *result, bool *ok) if (qstrcmp(QMetaType::typeName(d->type), "QMap") == 0) { *static_cast(result) = *static_cast *>(d->data.shared->ptr); + } else if (d->type == QVariant::Hash) { + QVariantMap *map = static_cast(result); + const QVariantHash *hash = v_cast(d); + const auto end = hash->end(); + for (auto it = hash->begin(); it != end; ++it) + map->insertMulti(it.key(), it.value()); #ifndef QT_BOOTSTRAPPED } else if (d->type == QMetaType::QJsonValue) { if (!v_cast(d)->isObject()) @@ -871,6 +877,12 @@ static bool convert(const QVariant::Private *d, int t, void *result, bool *ok) if (qstrcmp(QMetaType::typeName(d->type), "QHash") == 0) { *static_cast(result) = *static_cast *>(d->data.shared->ptr); + } else if (d->type == QVariant::Map) { + QVariantHash *hash = static_cast(result); + const QVariantMap *map = v_cast(d); + const auto end = map->end(); + for (auto it = map->begin(); it != end; ++it) + hash->insertMulti(it.key(), it.value()); #ifndef QT_BOOTSTRAPPED } else if (d->type == QMetaType::QJsonValue) { if (!v_cast(d)->isObject()) diff --git a/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp b/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp index d16948fd5d..e43b7acfb8 100644 --- a/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp +++ b/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp @@ -2558,6 +2558,8 @@ void tst_QVariant::variantMap() QVariant v3 = QVariant(QMetaType::type("QMap"), &map); QCOMPARE(qvariant_cast(v3).value("test").toInt(), 42); + QCOMPARE(v, QVariant(v.toHash())); + // multi-keys map.insertMulti("test", 47); v = map; @@ -2565,6 +2567,8 @@ void tst_QVariant::variantMap() QCOMPARE(map2, map); map2 = v.toMap(); QCOMPARE(map2, map); + + QCOMPARE(v, QVariant(v.toHash())); } void tst_QVariant::variantHash() @@ -2587,6 +2591,8 @@ void tst_QVariant::variantHash() QVariant v3 = QVariant(QMetaType::type("QHash"), &hash); QCOMPARE(qvariant_cast(v3).value("test").toInt(), 42); + QCOMPARE(v, QVariant(v.toMap())); + // multi-keys hash.insertMulti("test", 47); v = hash; @@ -2594,6 +2600,8 @@ void tst_QVariant::variantHash() QCOMPARE(hash2, hash); hash2 = v.toHash(); QCOMPARE(hash2, hash); + + QCOMPARE(v, QVariant(v.toMap())); } class CustomQObject : public QObject {