aboutsummaryrefslogtreecommitdiffstats
path: root/sources/pyside6/libpyside/pyside.cpp
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@qt.io>2025-09-30 11:04:49 +0200
committerFriedemann Kleint <Friedemann.Kleint@qt.io>2025-10-01 13:44:04 +0200
commitf3ebe9b044100826214741963459c837ac114723 (patch)
treeb2645aa03a31357e4d3be82909cb448afff086f8 /sources/pyside6/libpyside/pyside.cpp
parente6b19eb54a54fc24520db9449efa1ab43a6863c4 (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.cpp19
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);
}