diff options
author | Hugo Parente Lima <hugo.pl@gmail.com> | 2011-07-20 10:41:31 -0300 |
---|---|---|
committer | Hugo Parente Lima <hugo.pl@gmail.com> | 2012-03-08 16:54:37 -0300 |
commit | e37426c8c4a1f041c2f4b9c0f560751aa4b9a924 (patch) | |
tree | cbcd4d631282a8cc7818cb4674bae6227a603c87 /PySide/QtDeclarative | |
parent | 8ec69343969dd1ef767d9c8d38ce49d4280e5d4c (diff) |
Fix bug 926 - "qmlRegisterType does not work with QObject"
Reviewer: Luciano Wolf <luciano.wolf@openbossa.org>
Lauro Neto <lauro.neto@openbossa.org>
Diffstat (limited to 'PySide/QtDeclarative')
-rw-r--r-- | PySide/QtDeclarative/pysideqmlregistertype.cpp | 32 | ||||
-rw-r--r-- | PySide/QtDeclarative/typesystem_declarative.xml | 8 |
2 files changed, 15 insertions, 25 deletions
diff --git a/PySide/QtDeclarative/pysideqmlregistertype.cpp b/PySide/QtDeclarative/pysideqmlregistertype.cpp index f5b878be3..f769fa020 100644 --- a/PySide/QtDeclarative/pysideqmlregistertype.cpp +++ b/PySide/QtDeclarative/pysideqmlregistertype.cpp @@ -52,9 +52,7 @@ static void propListMetaCall(PySideProperty* pp, PyObject* self, QMetaObject::Ca static PyObject* pyTypes[PYSIDE_MAX_QML_TYPES]; static void (*createFuncs[PYSIDE_MAX_QML_TYPES])(void*); -/// QDeclarativeItem will create objects using placement new then this pointer is non-null. -void* PySide::nextQmlElementMemoryAddr = 0; -// Mutex used to avoid race condition on PySide::nextQmlElementMemoryAddr +// Mutex used to avoid race condition on PySide::nextQObjectMemoryAddr static QMutex nextQmlElementMutex; template<int N> @@ -63,12 +61,12 @@ struct ElementFactoryBase static void createInto(void* memory) { QMutexLocker locker(&nextQmlElementMutex); - PySide::nextQmlElementMemoryAddr = memory; + PySide::setNextQObjectMemoryAddr(memory); Shiboken::GilState state; PyObject* obj = PyObject_CallObject(pyTypes[N], 0); if (!obj || PyErr_Occurred()) PyErr_Print(); - PySide::nextQmlElementMemoryAddr = 0; + PySide::setNextQObjectMemoryAddr(0); } }; @@ -95,8 +93,8 @@ int PySide::qmlRegisterType(PyObject* pyObj, const char* uri, int versionMajor, { using namespace Shiboken; - static PyTypeObject* declarativeItemType = TypeResolver::get("QDeclarativeItem*")->pythonType(); - assert(declarativeItemType); + static PyTypeObject* qobjectType = TypeResolver::get("QObject*")->pythonType(); + assert(qobjectType); static int nextType = 0; if (nextType >= PYSIDE_MAX_QML_TYPES) { @@ -104,8 +102,8 @@ int PySide::qmlRegisterType(PyObject* pyObj, const char* uri, int versionMajor, return -1; } - if (!PySequence_Contains(((PyTypeObject*)pyObj)->tp_mro, (PyObject*)declarativeItemType)) { - PyErr_Format(PyExc_TypeError, "A type inherited from %s expected, got %s.", declarativeItemType->tp_name, ((PyTypeObject*)pyObj)->tp_name); + if (!PySequence_Contains(((PyTypeObject*)pyObj)->tp_mro, (PyObject*)qobjectType)) { + PyErr_Format(PyExc_TypeError, "A type inherited from %s expected, got %s.", qobjectType->tp_name, ((PyTypeObject*)pyObj)->tp_name); return -1; } @@ -118,9 +116,9 @@ int PySide::qmlRegisterType(PyObject* pyObj, const char* uri, int versionMajor, // Init proxy object static meta object QDeclarativePrivate::RegisterType type; type.version = 0; - type.typeId = qMetaTypeId<QDeclarativeItem*>(); - type.listId = qMetaTypeId<QDeclarativeListProperty<QDeclarativeItem> >(); - type.objectSize = sizeof(QDeclarativeItemWrapper); + type.typeId = qMetaTypeId<QObject*>(); + type.listId = qMetaTypeId<QDeclarativeListProperty<QObject> >(); + type.objectSize = PySide::getSizeOfQObject(reinterpret_cast<SbkObjectType*>(pyObj)); type.create = createFuncs[nextType]; type.uri = uri; type.versionMajor = versionMajor; @@ -128,12 +126,12 @@ int PySide::qmlRegisterType(PyObject* pyObj, const char* uri, int versionMajor, type.elementName = qmlName; type.metaObject = metaObject; - type.attachedPropertiesFunction = QDeclarativePrivate::attachedPropertiesFunc<QDeclarativeItem>(); - type.attachedPropertiesMetaObject = QDeclarativePrivate::attachedPropertiesMetaObject<QDeclarativeItem>(); + type.attachedPropertiesFunction = QDeclarativePrivate::attachedPropertiesFunc<QObject>(); + type.attachedPropertiesMetaObject = QDeclarativePrivate::attachedPropertiesMetaObject<QObject>(); - type.parserStatusCast = QDeclarativePrivate::StaticCastSelector<QDeclarativeItem,QDeclarativeParserStatus>::cast(); - type.valueSourceCast = QDeclarativePrivate::StaticCastSelector<QDeclarativeItem,QDeclarativePropertyValueSource>::cast(); - type.valueInterceptorCast = QDeclarativePrivate::StaticCastSelector<QDeclarativeItem,QDeclarativePropertyValueInterceptor>::cast(); + type.parserStatusCast = QDeclarativePrivate::StaticCastSelector<QObject, QDeclarativeParserStatus>::cast(); + type.valueSourceCast = QDeclarativePrivate::StaticCastSelector<QObject, QDeclarativePropertyValueSource>::cast(); + type.valueInterceptorCast = QDeclarativePrivate::StaticCastSelector<QObject, QDeclarativePropertyValueInterceptor>::cast(); type.extensionObjectCreate = 0; type.extensionMetaObject = 0; diff --git a/PySide/QtDeclarative/typesystem_declarative.xml b/PySide/QtDeclarative/typesystem_declarative.xml index e0c7b6d43..a72f601bf 100644 --- a/PySide/QtDeclarative/typesystem_declarative.xml +++ b/PySide/QtDeclarative/typesystem_declarative.xml @@ -103,14 +103,6 @@ <include file-name="pysideqmlregistertype.h" location="local"/> </extra-includes> <enum-type name="TransformOrigin" /> - <modify-function signature="QDeclarativeItem(QDeclarativeItem*)"> - <inject-code class="target"> - if (PySide::nextQmlElementMemoryAddr) - %0 = new (PySide::nextQmlElementMemoryAddr) ::QDeclarativePrivate::QDeclarativeElement<%TYPE>(); - else - %0 = new %TYPE(%1); - </inject-code> - </modify-function> </object-type> <value-type name="QDeclarativeListReference" /> |