aboutsummaryrefslogtreecommitdiffstats
path: root/PySide/QtCore
diff options
context:
space:
mode:
Diffstat (limited to 'PySide/QtCore')
-rw-r--r--PySide/QtCore/CMakeLists.txt1
-rw-r--r--PySide/QtCore/qvariant_conversions.h147
-rw-r--r--PySide/QtCore/typesystem_core.xml187
3 files changed, 80 insertions, 255 deletions
diff --git a/PySide/QtCore/CMakeLists.txt b/PySide/QtCore/CMakeLists.txt
index bbe8ba7b5..12a2f4a50 100644
--- a/PySide/QtCore/CMakeLists.txt
+++ b/PySide/QtCore/CMakeLists.txt
@@ -120,7 +120,6 @@ ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qtimerevent_wrapper.cpp
${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qtranslator_wrapper.cpp
${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qurl_wrapper.cpp
${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/quuid_wrapper.cpp
-${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qvariant_wrapper.cpp
${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qwaitcondition_wrapper.cpp
${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qwritelocker_wrapper.cpp
${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qxmlstreamattribute_wrapper.cpp
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;
+ }
+};
}
diff --git a/PySide/QtCore/typesystem_core.xml b/PySide/QtCore/typesystem_core.xml
index 625886198..85694e4ec 100644
--- a/PySide/QtCore/typesystem_core.xml
+++ b/PySide/QtCore/typesystem_core.xml
@@ -74,7 +74,6 @@
<enum-type name="QXmlStreamReader::Error"/>
<enum-type name="QXmlStreamReader::TokenType"/>
<enum-type name="QLineF::IntersectType" />
- <enum-type name="QVariant::Type" />
<!-- From Qt4.6 -->
<enum-type name="QXmlStreamReader::ReadElementTextBehaviour"/>
<enum-type name="QDataStream::FloatingPointPrecision"/>
@@ -129,7 +128,10 @@
<primitive-type name="signed long"/>
<primitive-type name="long"/>
<primitive-type name="unsigned long"/>
- <primitive-type name="WId"/>
+ <primitive-type name="WId">
+ <!-- FIXME This is a workaround to include some headers needed by some includes (nothing to do with QBool) -->
+ <include file-name="signalmanager.h" location="global"/>
+ </primitive-type>
<primitive-type name="Qt::HANDLE" target-lang-api-name="PyLong">
<!-- FIXME APIExtractor or shiboken do not support multiple includes by primitive type -->
<include file-name="QTextDocument" location="global"/>
@@ -154,6 +156,10 @@
<primitive-type name="QChar">
<conversion-rule file="qchar_conversions.h" />
</primitive-type>
+ <primitive-type name="QVariant">
+ <conversion-rule file="qvariant_conversions.h" />
+ <include file-name="typeresolver.h" location="global"/>
+ </primitive-type>
<container-type name="QSet" type="set">
<conversion-rule file="qset_conversions.h"/>
@@ -248,7 +254,6 @@
<rejection class="*" field-name="staticMetaObject"/>
<!-- not support array in property -->
<rejection class="QTextCodec::ConverterState" field-name="state_data"/>
- <rejection class="QVariant" field-name="handler"/>
<rejection class="QUuid" field-name="data1"/>
<rejection class="QUuid" field-name="data2"/>
<rejection class="QUuid" field-name="data3"/>
@@ -541,16 +546,6 @@
<rejection class="reverse_iterator"/>
<rejection class="stat"/>
<rejection class="tm"/>
- <rejection class="QVariant" function-name="canConvert"/>
- <rejection class="QVariant" function-name="fromValue"/>
- <rejection class="QVariant" function-name="value"/>
- <rejection class="QVariant" function-name="setValue"/>
- <rejection class="QVariant" function-name="data"/>
- <rejection class="QVariant" function-name="constData"/>
- <rejection class="QStringRef" function-name="constData"/>
- <rejection class="QStringRef" function-name="data"/>
- <rejection class="QStringRef" function-name="unicode"/>
- <rejection class="QStringRef" function-name="string"/>
<rejection class="QAbstractEventDispatcher" function-name="filterEvent"/>
<rejection class="QAbstractEventDispatcher" function-name="setEventFilter"/>
<rejection class="QAbstractFileEngine" function-name="beginEntryList"/>
@@ -1241,172 +1236,6 @@
</modify-argument>
</modify-function>
</object-type>
- <value-type name="QVariant">
- <conversion-rule file="qvariant_conversions.h" />
- <modify-function signature="create(int,const void*)" remove="all" />
-
- <!-- QVariant constructor is a beast with its own rules -->
- <modify-function signature="QVariant(float)" remove="all"/>
- <modify-function signature="QVariant(int)" remove="all"/>
- <modify-function signature="QVariant(double)" remove="all"/>
- <modify-function signature="QVariant(bool)" remove="all"/>
- <modify-function signature="QVariant(qlonglong)" remove="all"/>
- <modify-function signature="QVariant(int, const void*)" remove="all"/>
- <modify-function signature="QVariant(int,const void*,uint)" remove="all"/>
- <!-- handled by inject code -->
- <modify-function signature="QVariant(uint)" remove="all"/>
- <modify-function signature="QVariant(qulonglong)" remove="all"/>
- <modify-function signature="QVariant(const QByteArray&amp;)">
- <access modifier="private" />
- </modify-function>
- <modify-function signature="QVariant(QDataStream&amp;)" remove="all"/>
- <modify-function signature="QVariant(const QBitArray&amp;)">
- <access modifier="private" />
- </modify-function>
- <modify-function signature="QVariant(const QString&amp;)">
- <access modifier="private" />
- </modify-function>
- <modify-function signature="QVariant(const QStringList&amp;)" remove="all"/>
- <modify-function signature="QVariant(const QChar&amp;)">
- <access modifier="private" />
- </modify-function>
- <modify-function signature="QVariant(const QDate&amp;)">
- <access modifier="private" />
- </modify-function>
- <modify-function signature="QVariant(const QTime&amp;)">
- <access modifier="private" />
- </modify-function>
- <modify-function signature="QVariant(const QDateTime&amp;)">
- <access modifier="private" />
- </modify-function>
- <modify-function signature="QVariant(const QSize&amp;)">
- <access modifier="private" />
- </modify-function>
- <modify-function signature="QVariant(const QSizeF&amp;)">
- <access modifier="private" />
- </modify-function>
- <modify-function signature="QVariant(const QPoint&amp;)">
- <access modifier="private" />
- </modify-function>>
- <modify-function signature="QVariant(const QPointF&amp;)">
- <access modifier="private" />
- </modify-function>
- <modify-function signature="QVariant(const QRect&amp;)">
- <access modifier="private" />
- </modify-function>
- <modify-function signature="QVariant(const QRectF&amp;)" >
- <access modifier="private" />
- </modify-function>
- <modify-function signature="QVariant(const QUrl&amp;)">
- <access modifier="private" />
- </modify-function>
- <modify-function signature="QVariant(const QLocale&amp;)">
- <access modifier="private" />
- </modify-function>
- <modify-function signature="QVariant(const QRegExp&amp;)">
- <access modifier="private" />
- </modify-function>
- <modify-function signature="QVariant(QHash&lt;QString,QVariant>)" remove="all" />
- <modify-function signature="QVariant(QMap&lt;QString,QVariant>)" remove="all" />
- <modify-function signature="QVariant(QList&lt;QVariant>)" remove="all" />
- <modify-function signature="QVariant(QVariant)" remove="all" />
- <modify-function signature="QVariant(QLine)">
- <access modifier="private" />
- </modify-function>
- <modify-function signature="QVariant(QLineF)">
- <access modifier="private" />
- </modify-function>
-
- <add-function signature="QVariant(PyObject*)">
- <inject-code class="target" position="beginning">
- %0 = new %TYPE(%CONVERTTOCPP[QVariant](%PYARG_1));
- </inject-code>
- </add-function>
- <add-function signature="toPyObject()" return-type="PyObject*">
- <inject-code class="target" position="beginning">
- uint typeId = %CPPSELF.userType();
- if (typeId == qMetaTypeId&lt;PyQt_PyObject>()) {
- %PYARG_0 = %CPPSELF.value&lt;PyQt_PyObject>();
- } else if (typeId == QVariant::String) {
- %PYARG_0 = %CONVERTTOPYTHON[QString](%CPPSELF.toString());
- } else {
- %PYARG_0 = Py_None;
- Py_INCREF(Py_None);
- }
- </inject-code>
- </add-function>
- <modify-function signature="typeName()const">
- <inject-code class="target" position="beginning">
- if (%CPPSELF.isNull()) {
- %PYARG_0 = Py_None;
- Py_INCREF(Py_None);
- } else if (%CPPSELF.userType() == qMetaTypeId&lt;PyQt_PyObject>()) {
- // emulate PyQt4 behaviour
- PyObject* obj = %CPPSELF.value&lt;PyQt_PyObject>();
- if (PySequence_Check(obj))
- %PYARG_0 = %CONVERTTOPYTHON[%RETURN_TYPE]("QVariantList");
- }
- if (!%PYARG_0)
- %PYARG_0 = %CONVERTTOPYTHON[%RETURN_TYPE](%CPPSELF.%FUNCTION_NAME());
- </inject-code>
- </modify-function>
- <modify-function signature="toList()const">
- <inject-code class="target" position="beginning">
- if (%CPPSELF.userType() == qMetaTypeId&lt;PyQt_PyObject>()) {
- PyObject* val = %CPPSELF.value&lt;PyQt_PyObject>();
- if (PySequence_Check(val)) {
- %PYARG_0 = val;
- Py_INCREF(val);
- } else {
- %PYARG_0 = Py_None;
- Py_INCREF(Py_None);
- }
- } else {
- %PYARG_0 = %CONVERTTOPYTHON[%RETURN_TYPE](%CPPSELF.%FUNCTION_NAME());
- }
- </inject-code>
- </modify-function>
- <modify-function signature="toDouble(bool*)const">
- <modify-argument index="1">
- <remove-argument/>
- </modify-argument>
- <inject-code class="target" position="beginning">
- <insert-template name="fix_bool*"/>
- </inject-code>
- </modify-function>
- <modify-function signature="toInt(bool*)const">
- <modify-argument index="1">
- <remove-argument/>
- </modify-argument>
- <inject-code class="target" position="beginning">
- <insert-template name="fix_bool*"/>
- </inject-code>
- </modify-function>
- <modify-function signature="toLongLong(bool*)const">
- <modify-argument index="1">
- <remove-argument/>
- </modify-argument>
- <inject-code class="target" position="beginning">
- <insert-template name="fix_bool*"/>
- </inject-code>
- </modify-function>
- <modify-function signature="toUInt(bool*)const">
- <modify-argument index="1">
- <remove-argument/>
- </modify-argument>
- <inject-code class="target" position="beginning">
- <insert-template name="fix_bool*"/>
- </inject-code>
- </modify-function>
- <modify-function signature="toULongLong(bool*)const">
- <modify-argument index="1">
- <remove-argument/>
- </modify-argument>
- <inject-code class="target" position="beginning">
- <insert-template name="fix_bool*"/>
- </inject-code>
- </modify-function>
- </value-type>
<object-type name="QAbstractListModel" polymorphic-id-expression="qobject_cast&lt;QAbstractListModel*&gt;(%1)">
<extra-includes>
<include file-name="QStringList" location="global"/>