@@ -1936,15 +1936,31 @@ const QMetaObject* PythonQtPrivate::getDynamicMetaObject(PythonQtInstanceWrapper
19361936 PythonQtDynamicClassInfo* info = wrapper->dynamicClassInfo ();
19371937 if (info) {
19381938 if (!info->_dynamicMetaObject ) {
1939- buildDynamicMetaObject (((PythonQtClassWrapper*)Py_TYPE (wrapper)), prototypeMetaObject);
1939+ setupDynamicMetaObjectChain (((PythonQtClassWrapper*)Py_TYPE (wrapper)), prototypeMetaObject);
19401940 }
19411941 return info->_dynamicMetaObject ;
19421942 }
19431943 return prototypeMetaObject;
19441944}
19451945
1946- void PythonQtPrivate::buildDynamicMetaObject (PythonQtClassWrapper* type, const QMetaObject* prototypeMetaObject)
1946+ const QMetaObject* PythonQtPrivate::setupDynamicMetaObjectChain (PythonQtClassWrapper* type, const QMetaObject* prototypeMetaObject)
19471947{
1948+ if (!type->_dynamicClassInfo ->_dynamicMetaObject ) {
1949+ PyTypeObject* superType = ((PyTypeObject *)type)->tp_base ;
1950+ const QMetaObject* metaObjectOfParent = prototypeMetaObject;
1951+ if (((PythonQtClassWrapper*)superType)->_dynamicClassInfo ) {
1952+ metaObjectOfParent = setupDynamicMetaObjectChain ((PythonQtClassWrapper*)superType, prototypeMetaObject);
1953+ }
1954+ return buildDynamicMetaObject (type, metaObjectOfParent);
1955+ } else {
1956+ return type->_dynamicClassInfo ->_dynamicMetaObject ;
1957+ }
1958+ }
1959+
1960+ const QMetaObject* PythonQtPrivate::buildDynamicMetaObject (PythonQtClassWrapper* type, const QMetaObject* prototypeMetaObject)
1961+ {
1962+ // std::cout << "creating " << ((PyTypeObject*)type)->tp_name << " derived from " << prototypeMetaObject->className() << std::endl;
1963+
19481964 QMetaObjectBuilder builder;
19491965 builder.setSuperClass (prototypeMetaObject);
19501966 builder.setClassName (((PyTypeObject*)type)->tp_name );
@@ -2029,6 +2045,7 @@ void PythonQtPrivate::buildDynamicMetaObject(PythonQtClassWrapper* type, const Q
20292045 // we don't need an own meta object, just use the one from our base class
20302046 type->_dynamicClassInfo ->_dynamicMetaObject = prototypeMetaObject;
20312047 }
2048+ return type->_dynamicClassInfo ->_dynamicMetaObject ;
20322049}
20332050
20342051
0 commit comments