diff options
author | Maximilian Goldstein <max.goldstein@qt.io> | 2020-07-10 10:36:33 +0200 |
---|---|---|
committer | Maximilian Goldstein <max.goldstein@qt.io> | 2020-07-10 09:19:29 +0000 |
commit | 5380a126ad9a6f83a09588df084b0a1a807b604e (patch) | |
tree | a3fefbe5ba7b94a16d2ea6f04ca1e1d82142144a /sources | |
parent | 1bfd77c92d78c3861d0c09068e6c353020a510f4 (diff) |
Fix QML registration in dev
Change-Id: Ifc0e6495b02577c7c8028ac3011cd4585de6df87
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
Reviewed-by: Cristian Maureira-Fredes <cristian.maureira-fredes@qt.io>
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
Diffstat (limited to 'sources')
-rw-r--r-- | sources/pyside2/PySide2/QtQuick/pysidequickregistertype.cpp | 77 |
1 files changed, 37 insertions, 40 deletions
diff --git a/sources/pyside2/PySide2/QtQuick/pysidequickregistertype.cpp b/sources/pyside2/PySide2/QtQuick/pysidequickregistertype.cpp index 8e48c3d7f..f19dcdc03 100644 --- a/sources/pyside2/PySide2/QtQuick/pysidequickregistertype.cpp +++ b/sources/pyside2/PySide2/QtQuick/pysidequickregistertype.cpp @@ -117,6 +117,39 @@ bool pyTypeObjectInheritsFromClass(PyTypeObject *pyObjType, QByteArray className return isDerived; } +template <typename T> +struct QPysideQmlMetaTypeInterface : QtPrivate::QMetaTypeInterface +{ + const QByteArray name; + + QPysideQmlMetaTypeInterface(const QByteArray &name, const QMetaObject *metaObject = nullptr) + : QMetaTypeInterface { + /*.revision=*/ 0, + /*.size=*/ sizeof(T), + /*.alignment=*/ alignof(T), + /*.flags=*/ QtPrivate::QMetaTypeTypeFlags<T>::Flags, + /*.metaObject=*/ metaObject, + /*.name=*/ name.constData(), + /*.typeId=*/ 0, + /*.ref=*/ { Q_BASIC_ATOMIC_INITIALIZER(0) }, + /*.deleteSelf=*/ [](QMetaTypeInterface *self) { + delete static_cast<QPysideQmlMetaTypeInterface *>(self); + }, + /*.defaultCtr=*/ [](const QMetaTypeInterface *, void *addr) { new (addr) T(); }, + /*.copyCtr=*/ [](const QMetaTypeInterface *, void *addr, const void *other) { + new (addr) T(*reinterpret_cast<const T *>(other)); + }, + /*.moveCtr=*/ [](const QMetaTypeInterface *, void *addr, void *other) { + new (addr) T(std::move(*reinterpret_cast<T *>(other))); + }, + /*.dtor=*/ [](const QMetaTypeInterface *, void *addr) { + reinterpret_cast<T *>(addr)->~T(); + }, + /*.legacyRegisterOp=*/ nullptr + } + , name(name) {} +}; + template <class WrapperClass> void registerTypeIfInheritsFromClass( QByteArray className, @@ -129,47 +162,11 @@ void registerTypeIfInheritsFromClass( { bool shouldRegister = !registered && pyTypeObjectInheritsFromClass(typeToRegister, className); if (shouldRegister) { - int ptrType = -#if 0 // FIXME Qt 6 - QMetaType::registerNormalizedType( - typePointerName.constData(), - QtMetaTypePrivate::QMetaTypeFunctionHelper<WrapperClass *>::Destruct, - QtMetaTypePrivate::QMetaTypeFunctionHelper<WrapperClass *>::Construct, - sizeof(WrapperClass *), - static_cast< ::QFlags<QMetaType::TypeFlag> >(QtPrivate::QMetaTypeTypeFlags< - WrapperClass *>::Flags), - typeMetaObject); - if (ptrType == -1) { - PyErr_Format(PyExc_TypeError, "Meta type registration of \"%s\" for QML usage failed.", - typePointerName.constData()); - return; - } -#else - -1; -#endif - int lstType = -#if 0 // FIXME Qt 6 - QMetaType::registerNormalizedType( - typeListName.constData(), - QtMetaTypePrivate::QMetaTypeFunctionHelper<QQmlListProperty<WrapperClass> > - ::Destruct, - QtMetaTypePrivate::QMetaTypeFunctionHelper<QQmlListProperty<WrapperClass> > - ::Construct, - sizeof(QQmlListProperty<WrapperClass>), - static_cast< ::QFlags<QMetaType::TypeFlag> >( - QtPrivate::QMetaTypeTypeFlags<QQmlListProperty<WrapperClass> >::Flags), - nullptr); -#else - -1; -#endif - if (lstType == -1) { - PyErr_Format(PyExc_TypeError, "Meta type registration of \"%s\" for QML usage failed.", - typeListName.constData()); - return; - } + QMetaType ptrType(new QPysideQmlMetaTypeInterface<WrapperClass *>(typePointerName, typeMetaObject)); + QMetaType lstType(new QPysideQmlMetaTypeInterface<QQmlListProperty<WrapperClass>>(typeListName)); - type->typeId = QMetaType(ptrType); - type->listId = QMetaType(lstType); + type->typeId = std::move(ptrType); + type->listId = std::move(lstType); type->attachedPropertiesFunction = QQmlPrivate::attachedPropertiesFunc<WrapperClass>(); type->attachedPropertiesMetaObject = QQmlPrivate::attachedPropertiesMetaObject<WrapperClass>(); |