diff options
Diffstat (limited to 'PySide/QtCore/qvariant_conversions.h')
-rw-r--r-- | PySide/QtCore/qvariant_conversions.h | 147 |
1 files changed, 72 insertions, 75 deletions
diff --git a/PySide/QtCore/qvariant_conversions.h b/PySide/QtCore/qvariant_conversions.h index aa6d521fb..076ed7f92 100644 --- a/PySide/QtCore/qvariant_conversions.h +++ b/PySide/QtCore/qvariant_conversions.h @@ -1,86 +1,83 @@ -// We use this thin wrapper instead of the plain PyObject pointer to avoid conflicts with specializations of T* -// in QVariant. -struct PyQt_PyObject -{ - PyObject* m_me; - PyQt_PyObject(PyObject* me) : m_me(me) {} - PyQt_PyObject() : m_me(Py_None) {} - operator PyObject*() { return m_me; } -}; - -Q_DECLARE_METATYPE(PyQt_PyObject) - namespace Shiboken { -inline bool Converter<QVariant>::checkType(PyObject* pyObj) +template<> +struct Converter<QVariant> { - return ValueTypeConverter<QVariant>::checkType(pyObj); -} + static bool checkType(PyObject* pyObj) + { + return false; // lets avoid the chaos + } -// all types are convertible to QVariant -inline bool Converter<QVariant>::isConvertible(PyObject* pyObj) -{ - return true; -} + // all types are convertible to QVariant + static bool isConvertible(PyObject* pyObj) + { + return true; + } -inline QVariant Converter<QVariant>::toCpp(PyObject* pyObj) -{ - if (SbkQVariant_Check(pyObj)) - return *Converter<QVariant*>::toCpp(pyObj); + static QVariant toCpp(PyObject* pyObj) + { + using namespace Shiboken; - // 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<PyQt_PyObject>(pyObj); - } else { - // 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()); + // Primitive types + if (Converter<bool>::checkType(pyObj)) { + // QVariant(bool) + return QVariant(Converter<bool>::toCpp(pyObj)); + } else if (pyObj == Py_None) { + // QVariant() + return QVariant(); + } else if (Converter<QString>::checkType(pyObj)) { + // QVariant(const char*) + return QVariant(Converter<QString>::toCpp(pyObj)); + } else if (PyFloat_CheckExact(pyObj)) { + // QVariant(double) + return QVariant(Converter<double>::toCpp(pyObj)); + } else if (PyInt_CheckExact(pyObj)) { + // QVariant(int) + return QVariant(Converter<int>::toCpp(pyObj)); + } else if (PyLong_CheckExact(pyObj)) { + // QVariant(qlonglong) + return QVariant(Converter<qlonglong>::toCpp(pyObj)); + } else if (Shiboken::isShibokenEnum(pyObj)) { + // QVariant(enum) + return QVariant(Converter<int>::toCpp(pyObj)); + } else if (!isShibokenType(pyObj) || isUserType(pyObj)) { + // QVariant(User class) + return QVariant::fromValue<PySide::PyObjectWrapper>(pyObj); + } else { + // 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]); } - if (typeCode) - return QVariant(typeCode, reinterpret_cast<SbkBaseWrapper*>(pyObj)->cptr[0]); + // Is a shiboken type not known by Qt + return QVariant::fromValue<PySide::PyObjectWrapper>(pyObj); } - // Is a shiboken type not known by Qt - Py_INCREF(pyObj); - return QVariant::fromValue<PyQt_PyObject>(pyObj); } -} - -inline PyObject* Converter<QVariant>::toPython(const QVariant& cppObj) -{ - return ValueTypeConverter<QVariant>::toPython(cppObj); -} + static PyObject* toPython(void* cppObj) { return toPython(*reinterpret_cast<QVariant*>(cppObj)); } + static PyObject* toPython(const QVariant& cppObj) + { + if (cppObj.isValid()) { + Shiboken::TypeResolver* tr = Shiboken::TypeResolver::get(cppObj.typeName()); + if (tr) + return tr->toPython(const_cast<void*>(cppObj.data())); + } + Py_RETURN_NONE; + } +}; } |