diff --git a/src/corelib/kernel/qvariant.h b/src/corelib/kernel/qvariant.h index 04b93c262a7..907094d25c1 100644 --- a/src/corelib/kernel/qvariant.h +++ b/src/corelib/kernel/qvariant.h @@ -53,6 +53,7 @@ #include #endif #include +#include #if __has_include() && __cplusplus >= 201703L #include @@ -572,6 +573,12 @@ template inline T qvariant_cast(const QVariant &v) QMetaType targetType = QMetaType::fromType(); if (v.d.type() == targetType) return v.d.get(); + if constexpr (std::is_same_v> const *>) { + using nonConstT = std::remove_const_t> *; + QMetaType nonConstTargetType = QMetaType::fromType(); + if (v.d.type() == nonConstTargetType) + return v.d.get(); + } T t{}; QMetaType::convert(v.metaType(), v.constData(), targetType, &t); diff --git a/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp b/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp index 251bb803b41..8df3b4055bb 100644 --- a/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp +++ b/tests/auto/corelib/kernel/qvariant/tst_qvariant.cpp @@ -169,6 +169,7 @@ private slots: void qvariant_cast_QObject_derived(); void qvariant_cast_QObject_wrapper(); void qvariant_cast_QSharedPointerQObject(); + void qvariant_cast_const(); void toLocale(); @@ -2579,6 +2580,17 @@ void tst_QVariant::qvariant_cast_QSharedPointerQObject() qRegisterMetaType >(); } +void tst_QVariant::qvariant_cast_const() +{ + int i = 42; + QVariant v = QVariant::fromValue(&i); + QVariant vConst = QVariant::fromValue(const_cast(&i)); + QCOMPARE(v.value(), &i); + QCOMPARE(v.value(), &i); + QCOMPARE(vConst.value(), nullptr); + QCOMPARE(vConst.value(), &i); +} + void tst_QVariant::convertToQUint8() const { /* qint8. */