diff options
-rw-r--r-- | src/corelib/kernel/qassociativeiterable.cpp | 14 | ||||
-rw-r--r-- | tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp | 14 |
2 files changed, 26 insertions, 2 deletions
diff --git a/src/corelib/kernel/qassociativeiterable.cpp b/src/corelib/kernel/qassociativeiterable.cpp index 41db3485f0..7b4c103c63 100644 --- a/src/corelib/kernel/qassociativeiterable.cpp +++ b/src/corelib/kernel/qassociativeiterable.cpp @@ -264,9 +264,19 @@ void QAssociativeIterable::removeKey(const QVariant &key) QVariant QAssociativeIterable::value(const QVariant &key) const { const QMetaAssociation meta = metaContainer(); + const QMetaType mappedMetaType = meta.mappedMetaType(); + QtPrivate::QVariantTypeCoercer coercer; - QVariant result(QMetaType(meta.mappedMetaType())); - meta.mappedAtKey(constIterable(), coercer.coerce(key, meta.keyMetaType()), result.data()); + const void *keyData = coercer.coerce(key, meta.keyMetaType()); + + if (mappedMetaType == QMetaType::fromType<QVariant>()) { + QVariant result; + meta.mappedAtKey(constIterable(), keyData, &result); + return result; + } + + QVariant result(mappedMetaType); + meta.mappedAtKey(constIterable(), keyData, result.data()); return result; } diff --git a/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp b/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp index d3feabfac1..8860d3cabf 100644 --- a/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp +++ b/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp @@ -4456,6 +4456,20 @@ void tst_QVariant::iterateContainerElements() numsCopy << *(it++); QCOMPARE(nums, numsCopy); } + + { + auto container = QVariantMap(); + + container["one"] = 1; + + auto containerVariant = QVariant::fromValue(container); + auto iter = containerVariant.value<QAssociativeIterable>(); + auto value = iter.value("one"); + QCOMPARE(value, QVariant(1)); + + auto f = iter.constFind("one"); + QCOMPARE(*f, QVariant(1)); + } } void tst_QVariant::pairElements() |