QAssociativeIterable: Unwrap variants on value()

Fixes: QTBUG-87688
Change-Id: I66515eaa1217c34f003648af6423b318b54977c4
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
bb10
Ulf Hermann 2020-10-19 14:52:58 +02:00
parent 45c248a011
commit 2d0a5f7a01
2 changed files with 26 additions and 2 deletions

View File

@ -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;
}

View File

@ -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()