diff options
author | Hugo Lima <hugo.lima@openbossa.org> | 2010-04-01 18:12:40 -0300 |
---|---|---|
committer | Hugo Parente Lima <hugo.pl@gmail.com> | 2010-04-05 14:36:01 -0300 |
commit | 956d6fd530a5c1c526dc64a357addd790ab87c12 (patch) | |
tree | 3f5827124f1318245338b3ab1c864319e8809a68 /PySide/QtCore/qvariant_conversions.h | |
parent | 77c2be562b00166172caf7fc460765488e47e3a4 (diff) |
Fix some issues with QVariant, including the QAbstractKinectScroller one.
Diffstat (limited to 'PySide/QtCore/qvariant_conversions.h')
-rw-r--r-- | PySide/QtCore/qvariant_conversions.h | 94 |
1 files changed, 50 insertions, 44 deletions
diff --git a/PySide/QtCore/qvariant_conversions.h b/PySide/QtCore/qvariant_conversions.h index d6c23efd4..cd2ab8da0 100644 --- a/PySide/QtCore/qvariant_conversions.h +++ b/PySide/QtCore/qvariant_conversions.h @@ -32,57 +32,63 @@ QT_END_NAMESPACE namespace Shiboken { // all types are convertible to QVariant -inline bool Converter<QVariant>::isConvertible(PyObject* pyobj) +inline bool Converter<QVariant>::isConvertible(PyObject* pyObj) { return true; } -inline QVariant Converter<QVariant>::toCpp(PyObject* pyobj) +inline QVariant Converter<QVariant>::toCpp(PyObject* pyObj) { - if (SbkQVariant_Check(pyobj)) - return *Converter<QVariant*>::toCpp(pyobj); - // voodoo stuff to avoid linking qtcore bindings with qtgui bindings - QString className(pyobj->ob_type->tp_name); - className = className.mid(className.lastIndexOf(".") + 1); - uint typeCode = QMetaType::type(className.toAscii()); - if (!typeCode || typeCode > QVariant::UserType) { + if (SbkQVariant_Check(pyObj)) + return *Converter<QVariant*>::toCpp(pyObj); - // 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); - } + // Primitive types + if (PyBool_Check(pyObj)) { + // QVariant(bool) + return QVariant(Shiboken::Converter<bool>::toCpp(pyObj)); + } else if (PyString_CheckExact(pyObj)) { + // QVariant(const char*) + return QVariant(Shiboken::Converter<const char *>::toCpp(pyObj)); + } else if (PyFloat_CheckExact(pyObj)) { + // QVariant(double) + return QVariant(Shiboken::Converter<double>::toCpp(pyObj)); + } else if (PyInt_CheckExact(pyObj)) { + // QVariant(int) + return QVariant(Shiboken::Converter<int>::toCpp(pyObj)); + } else if (PyLong_CheckExact(pyObj)) { + // QVariant(qlonglong) + return QVariant(Shiboken::Converter<qlonglong>::toCpp(pyObj)); + } else if (Shiboken::isShibokenEnum(pyObj)) { + // QVariant(enum) + return QVariant(Shiboken::Converter<int>::toCpp(pyObj)); + } else if (!Shiboken::isShibokenType(pyObj) || Shiboken::isUserType(pyObj)) { + // QVariant(User class) + Py_INCREF(pyObj); + return QVariant::fromValue<PyObjectHolder>(pyObj); } else { - // Is a known Qt type - return QVariant(typeCode, reinterpret_cast<SbkBaseWrapper*>(pyobj)->cptr[0]); + // a class supported by QVariant? + const char* typeName = pyObj->ob_type->tp_name; + // check if the name starts with PySide. + if (!strncmp("PySide.", typeName, 7)) { + // get the type name + const char* lastDot = typeName; + for (int i = 8; typeName[i]; ++i) { + if (typeName[i] == '.') + lastDot = &typeName[i]; + } + lastDot++; + uint typeCode = QMetaType::type(lastDot); + if (!typeCode) {// Try with star at end, for QObject*, QWidget* and QAbstractKinectScroller* + QString typeName(lastDot); + typeName += '*'; + typeCode = QMetaType::type(typeName.toAscii()); + } + if (typeCode) + return QVariant(typeCode, reinterpret_cast<SbkBaseWrapper*>(pyObj)->cptr[0]); + } + // Is a shiboken type not known by Qt + Py_INCREF(pyObj); + return QVariant::fromValue<PyObjectHolder>(pyObj); } } |