diff options
author | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2020-02-05 13:36:09 +0100 |
---|---|---|
committer | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2020-02-06 07:02:34 +0100 |
commit | 683598e0b008078cb6cc00f2b22a75b6404ccc96 (patch) | |
tree | 6196af6420b5d21d2f38c458d23700965b58ddfa | |
parent | 7eb80045546ae76edf60cb14a4d20bb17e509a65 (diff) |
Create best-matching wrapper for unknown classes inheriting QObject
Walk up the MetaObject hierarchy until a matching type is found.
Fixes: PYSIDE-1214
Change-Id: I474edbfc710375951987e43469b7e7ea4366ab0c
Reviewed-by: Cristian Maureira-Fredes <cristian.maureira-fredes@qt.io>
-rw-r--r-- | sources/pyside2/libpyside/pyside.cpp | 21 |
1 files changed, 19 insertions, 2 deletions
diff --git a/sources/pyside2/libpyside/pyside.cpp b/sources/pyside2/libpyside/pyside.cpp index 2419b2e16..eeb4de037 100644 --- a/sources/pyside2/libpyside/pyside.cpp +++ b/sources/pyside2/libpyside/pyside.cpp @@ -401,6 +401,24 @@ static void invalidatePtr(any_t *object) static const char invalidatePropertyName[] = "_PySideInvalidatePtr"; +// PYSIDE-1214, when creating new wrappers for classes inheriting QObject but +// not exposed to Python, try to find the best-matching (most-derived) Qt +// class by walking up the meta objects. +static const char *typeName(QObject *cppSelf) +{ + const char *typeName = typeid(*cppSelf).name(); + if (!Shiboken::Conversions::getConverter(typeName)) { + for (auto metaObject = cppSelf->metaObject(); metaObject; metaObject = metaObject->superClass()) { + const char *name = metaObject->className(); + if (Shiboken::Conversions::getConverter(name)) { + typeName = name; + break; + } + } + } + return typeName; +} + PyObject *getWrapperForQObject(QObject *cppSelf, SbkObjectType *sbk_type) { PyObject *pyOut = reinterpret_cast<PyObject *>(Shiboken::BindingManager::instance().retrieveWrapper(cppSelf)); @@ -423,8 +441,7 @@ PyObject *getWrapperForQObject(QObject *cppSelf, SbkObjectType *sbk_type) } } - const char *typeName = typeid(*cppSelf).name(); - pyOut = Shiboken::Object::newObject(sbk_type, cppSelf, false, false, typeName); + pyOut = Shiboken::Object::newObject(sbk_type, cppSelf, false, false, typeName(cppSelf)); return pyOut; } |