From e00da49c844ef1a8025abdb91c4c11416c0f1e98 Mon Sep 17 00:00:00 2001 From: Hugo Parente Lima Date: Fri, 21 May 2010 15:48:45 -0300 Subject: Fix QVariant custom code to work with Qt4.7. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Instead of expand QDECLARE_METATYPE just to change a string, change the class name used to hold the PyObject and use the Qt macro. This will protect us on future changes on this macro like the one on Qt 4.7. Reviewer: Renato Araújo Luciano Wolf --- PySide/QtCore/qvariant_conversions.h | 31 ++++++------------------------- PySide/QtCore/typesystem_core.xml | 12 ++++++------ 2 files changed, 12 insertions(+), 31 deletions(-) (limited to 'PySide/QtCore') diff --git a/PySide/QtCore/qvariant_conversions.h b/PySide/QtCore/qvariant_conversions.h index cd2ab8da0..f0f78a077 100644 --- a/PySide/QtCore/qvariant_conversions.h +++ b/PySide/QtCore/qvariant_conversions.h @@ -1,33 +1,14 @@ // We use this thin wrapper instead of the plain PyObject pointer to avoid conflicts with specializations of T* // in QVariant. -struct PyObjectHolder +struct PyQt_PyObject { PyObject* m_me; - PyObjectHolder(PyObject* me) : m_me(me) {} - PyObjectHolder() : m_me(Py_None) {} + PyQt_PyObject(PyObject* me) : m_me(me) {} + PyQt_PyObject() : m_me(Py_None) {} operator PyObject*() { return m_me; } }; -/** - * Q_DECLARE_METATYPE(PyObjectHolder); - * Use the expanded version of Q_DECLARE_METATYPE macro to define a typename - * compatible with PyQt4 - **/ -QT_BEGIN_NAMESPACE -template <> -struct QMetaTypeId< PyObjectHolder > -{ - enum { Defined = 1 }; - static int qt_metatype_id() - { - static QBasicAtomicInt metatype_id = Q_BASIC_ATOMIC_INITIALIZER(0); - if (!metatype_id) - metatype_id = - qRegisterMetaType("PyQt_PyObject"); - return metatype_id; - } -}; -QT_END_NAMESPACE +Q_DECLARE_METATYPE(PyQt_PyObject) namespace Shiboken { @@ -64,7 +45,7 @@ inline QVariant Converter::toCpp(PyObject* pyObj) } else if (!Shiboken::isShibokenType(pyObj) || Shiboken::isUserType(pyObj)) { // QVariant(User class) Py_INCREF(pyObj); - return QVariant::fromValue(pyObj); + return QVariant::fromValue(pyObj); } else { // a class supported by QVariant? const char* typeName = pyObj->ob_type->tp_name; @@ -88,7 +69,7 @@ inline QVariant Converter::toCpp(PyObject* pyObj) } // Is a shiboken type not known by Qt Py_INCREF(pyObj); - return QVariant::fromValue(pyObj); + return QVariant::fromValue(pyObj); } } diff --git a/PySide/QtCore/typesystem_core.xml b/PySide/QtCore/typesystem_core.xml index 186be106a..e64006c0e 100644 --- a/PySide/QtCore/typesystem_core.xml +++ b/PySide/QtCore/typesystem_core.xml @@ -1519,8 +1519,8 @@ uint typeId = %CPPSELF.userType(); - if (typeId == qMetaTypeId<PyObjectHolder>()) { - %PYARG_0 = %CPPSELF.value<PyObjectHolder>(); + if (typeId == qMetaTypeId<PyQt_PyObject>()) { + %PYARG_0 = %CPPSELF.value<PyQt_PyObject>(); } else if (typeId == QVariant::String) { %PYARG_0 = %CONVERTTOPYTHON[QString](%CPPSELF.toString()); } else { @@ -1534,9 +1534,9 @@ if (%CPPSELF.isNull()) { %PYARG_0 = Py_None; Py_INCREF(Py_None); - } else if (%CPPSELF.userType() == qMetaTypeId<PyObjectHolder>()) { + } else if (%CPPSELF.userType() == qMetaTypeId<PyQt_PyObject>()) { // emulate PyQt4 behaviour - PyObject* obj = %CPPSELF.value<PyObjectHolder>(); + PyObject* obj = %CPPSELF.value<PyQt_PyObject>(); if (PySequence_Check(obj)) %PYARG_0 = %CONVERTTOPYTHON[%RETURN_TYPE]("QVariantList"); } @@ -1546,8 +1546,8 @@ - if (%CPPSELF.userType() == qMetaTypeId<PyObjectHolder>()) { - PyObject* val = %CPPSELF.value<PyObjectHolder>(); + if (%CPPSELF.userType() == qMetaTypeId<PyQt_PyObject>()) { + PyObject* val = %CPPSELF.value<PyQt_PyObject>(); if (PySequence_Check(val)) { %PYARG_0 = val; Py_INCREF(val); -- cgit v1.2.3