aboutsummaryrefslogtreecommitdiffstats
path: root/PySide/QtCore/qvariant_conversions.h
diff options
context:
space:
mode:
Diffstat (limited to 'PySide/QtCore/qvariant_conversions.h')
-rw-r--r--PySide/QtCore/qvariant_conversions.h147
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;
+ }
+};
}