diff options
| author | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2025-09-30 11:04:49 +0200 |
|---|---|---|
| committer | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2025-10-01 13:44:04 +0200 |
| commit | f3ebe9b044100826214741963459c837ac114723 (patch) | |
| tree | b2645aa03a31357e4d3be82909cb448afff086f8 /sources/pyside6/libpyside/pyside.cpp | |
| parent | e6b19eb54a54fc24520db9449efa1ab43a6863c4 (diff) | |
Fix handling type with equal names in signal/slot
The decision whether to create a derived meta object class parsed from
the Python type in MetaObjectBuilder was based on comparing the class
name to the base meta object (the Python parsing must not be done
when creating a meta object for a plain wrapped Qt type).
This led to mixups when base class names were identical which is
possible in Python.
To fix this, split apart the code path not requiring Python type
parsing (called from the wrapper code when initializing wrapped Qt
classes) and expand the code for Python derived classes into
initQObjectSubType().
Fixes: PYSIDE-3201
Pick-to: 6.10
Change-Id: Id62e7dc9b8af16154b161cdbf5dd0d460c55f6f1
Reviewed-by: Cristian Maureira-Fredes <cristian.maureira-fredes@qt.io>
Diffstat (limited to 'sources/pyside6/libpyside/pyside.cpp')
| -rw-r--r-- | sources/pyside6/libpyside/pyside.cpp | 19 |
1 files changed, 12 insertions, 7 deletions
diff --git a/sources/pyside6/libpyside/pyside.cpp b/sources/pyside6/libpyside/pyside.cpp index 45044225c..4030673a5 100644 --- a/sources/pyside6/libpyside/pyside.cpp +++ b/sources/pyside6/libpyside/pyside.cpp @@ -458,15 +458,13 @@ std::size_t getSizeOfQObject(PyTypeObject *type) return retrieveTypeUserData(type)->cppObjSize; } -void initDynamicMetaObject(PyTypeObject *type, const QMetaObject *base, std::size_t cppObjSize) +static void initDynamicMetaObjectHelper(PyTypeObject *type, + TypeUserData *userData) { - //create DynamicMetaObject based on python type - auto *userData = new TypeUserData(reinterpret_cast<PyTypeObject *>(type), base, cppObjSize); - userData->mo.update(); Shiboken::ObjectType::setTypeUserData(type, userData, Shiboken::callCppDestructor<TypeUserData>); - //initialize staticQMetaObject property - void *metaObjectPtr = const_cast<QMetaObject *>(userData->mo.update()); + // initialize staticQMetaObject property + const void *metaObjectPtr = userData->mo.update(); static SbkConverter *converter = Shiboken::Conversions::getConverter("QMetaObject"); if (!converter) return; @@ -475,6 +473,11 @@ void initDynamicMetaObject(PyTypeObject *type, const QMetaObject *base, std::siz Shiboken::PyName::qtStaticMetaObject(), pyMetaObject); } +void initDynamicMetaObject(PyTypeObject *type, const QMetaObject *base, std::size_t cppObjSize) +{ + initDynamicMetaObjectHelper(type, new TypeUserData(base, cppObjSize)); +} + TypeUserData *retrieveTypeUserData(PyTypeObject *pyTypeObj) { if (!SbkObjectType_Check(pyTypeObj)) @@ -526,7 +529,9 @@ void initQObjectSubType(PyTypeObject *type, PyObject *args, PyObject * /* kwds * // PYSIDE-1463: Don't change feature selection durin subtype initialization. // This behavior is observed with PySide 6. PySide::Feature::Enable(false); - initDynamicMetaObject(type, userData->mo.update(), userData->cppObjSize); + // create DynamicMetaObject based on python type + auto *subTypeData = new TypeUserData(type, userData->mo.update(), userData->cppObjSize); + initDynamicMetaObjectHelper(type, subTypeData); PySide::Feature::Enable(true); } |
