diff options
author | Hugo Lima <hugo.lima@openbossa.org> | 2010-02-18 17:47:32 -0200 |
---|---|---|
committer | Hugo Lima <hugo.lima@openbossa.org> | 2010-02-18 18:00:49 -0200 |
commit | 20077974e87ea27bb4710aaa89edd0bf97ba60ce (patch) | |
tree | 4ab27250790a52267af830a6e089aa2206bc5ec8 /PySide/QtCore/qvariant_conversions.h | |
parent | ae55152a9255cc20dc44332d456ae944848ed212 (diff) |
Move QVariant converter implementation to global header.
Diffstat (limited to 'PySide/QtCore/qvariant_conversions.h')
-rw-r--r-- | PySide/QtCore/qvariant_conversions.h | 84 |
1 files changed, 82 insertions, 2 deletions
diff --git a/PySide/QtCore/qvariant_conversions.h b/PySide/QtCore/qvariant_conversions.h index 2f96f1dab..43205f006 100644 --- a/PySide/QtCore/qvariant_conversions.h +++ b/PySide/QtCore/qvariant_conversions.h @@ -1,3 +1,83 @@ +// We use this thin wrapper instead of the plain PyObject pointer to avoid conflicts with specializations of T* +// in QVariant. +struct PyObjectHolder +{ + PyObject* m_me; + PyObjectHolder(PyObject* me) : m_me(me) {} + PyObjectHolder() : m_me(Py_None) {} + operator PyObject*() { return m_me; } +}; -// This is just a place holder to avoid automatic generation of the QVariant converter, -// The QVariant converter implementation is inside a glue code called qvariant_converter_impl.cpp +/** + * 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<PyObjectHolder>("PyQt_PyObject"); + return metatype_id; + } +}; +QT_END_NAMESPACE + +// all types are convertible to QVariant +inline bool Converter<QVariant>::isConvertible(PyObject* pyobj) +{ + return true; +} + +inline QVariant Converter<QVariant>::toCpp(PyObject* pyobj) +{ + if (SbkQVariant_Check(pyobj)) + return *SbkQVariant_cptr(pyobj); + // voodoo stuff to avoid linking qtcore bindings with qtgui bindings + uint typeCode = QMetaType::type(pyobj->ob_type->tp_name); + if (!typeCode || typeCode > QVariant::UserType) { + + // Check the implicit conversion stuff for most python-native types + if (SbkPySide_QtCore_QVariant_Type_CheckExact(pyobj)) { + QVariant::Type cpp_arg0 = Shiboken::Converter<QVariant::Type >::toCpp(pyobj); + // QVariant(QVariant::Type) + return QVariant(cpp_arg0); + } else if (SbkPySide_QtCore_Qt_GlobalColor_CheckExact(pyobj)) { + Qt::GlobalColor cpp_arg0 = Shiboken::Converter<Qt::GlobalColor >::toCpp(pyobj); + // QVariant(Qt::GlobalColor) + return QVariant(cpp_arg0); + } else if (PyBool_Check(pyobj)) { + bool cpp_arg0 = Shiboken::Converter<bool >::toCpp(pyobj); + // QVariant(bool) + return QVariant(cpp_arg0); + } else if (PyString_Check(pyobj)) { + const char * cpp_arg0 = Shiboken::Converter<const char * >::toCpp(pyobj); + // QVariant(const char*) + return QVariant(cpp_arg0); + } else if (PyFloat_Check(pyobj)) { + double cpp_arg0 = Shiboken::Converter<double >::toCpp(pyobj); + // QVariant(double) + return QVariant(cpp_arg0); + } else if (PyNumber_Check(pyobj)) { + int cpp_arg0 = Shiboken::Converter<int >::toCpp(pyobj); + // QVariant(int) + return QVariant(cpp_arg0); + } else if (PyLong_Check(pyobj)) { + qlonglong cpp_arg0 = Shiboken::Converter<qlonglong >::toCpp(pyobj); + // QVariant(qlonglong) + return QVariant(cpp_arg0); + } else { + Py_INCREF(pyobj); + return QVariant::fromValue<PyObjectHolder>(pyobj); + } + } else { + // Is a known Qt type + return QVariant(typeCode, reinterpret_cast<SbkBaseWrapper*>(pyobj)->cptr); + } +} |