diff --git a/src/corelib/kernel/qmetatype.h b/src/corelib/kernel/qmetatype.h index fe810ef044..e40cd85b22 100644 --- a/src/corelib/kernel/qmetatype.h +++ b/src/corelib/kernel/qmetatype.h @@ -1525,7 +1525,7 @@ struct SharedPointerMetaTypeIdHelper, true> \ }; \ template \ struct MetaTypeSmartPointerHelper , \ - typename std::enable_if::Value>::type> \ + typename std::enable_if::Value && !std::is_const_v>::type> \ { \ static bool registerConverter() \ { \ diff --git a/tests/auto/corelib/kernel/qobject/tst_qobject.cpp b/tests/auto/corelib/kernel/qobject/tst_qobject.cpp index 2e0895dbb4..f765440e71 100644 --- a/tests/auto/corelib/kernel/qobject/tst_qobject.cpp +++ b/tests/auto/corelib/kernel/qobject/tst_qobject.cpp @@ -8224,5 +8224,22 @@ void tst_QObject::emitToDestroyedClass() static_assert(QtPrivate::HasQ_OBJECT_Macro::Value); static_assert(!QtPrivate::HasQ_OBJECT_Macro::Value); +Q_DECLARE_SMART_POINTER_METATYPE(std::shared_ptr) +Q_DECLARE_SMART_POINTER_METATYPE(std::unique_ptr) + + +// QTBUG-103741: OK to use smart pointers to const QObject in signals/slots +class SenderWithSharedPointerConstQObject : public QObject +{ + Q_OBJECT + +signals: + void aSignal1(const QSharedPointer &); + void aSignal2(const QWeakPointer &); + void aSignal3(const QPointer &); + void aSignal4(const std::shared_ptr &); + void aSignal5(const std::unique_ptr &); +}; + QTEST_MAIN(tst_QObject) #include "tst_qobject.moc"