summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/corelib/kernel/qassociativeiterable.cpp14
-rw-r--r--tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp14
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()