diff options
-rw-r--r-- | sources/pyside2/PySide2/QtCore/typesystem_core_common.xml | 315 | ||||
-rw-r--r-- | sources/pyside2/PySide2/QtGui/typesystem_gui_common.xml | 8 | ||||
-rw-r--r-- | sources/pyside2/PySide2/glue/qtcore.cpp | 279 | ||||
-rw-r--r-- | sources/pyside2/PySide2/glue/qtgui.cpp | 22 | ||||
-rw-r--r-- | sources/pyside2/PySide2/glue/qtwidgets.cpp | 12 |
5 files changed, 361 insertions, 275 deletions
diff --git a/sources/pyside2/PySide2/QtCore/typesystem_core_common.xml b/sources/pyside2/PySide2/QtCore/typesystem_core_common.xml index 8aade34af..ca9a56c6e 100644 --- a/sources/pyside2/PySide2/QtCore/typesystem_core_common.xml +++ b/sources/pyside2/PySide2/QtCore/typesystem_core_common.xml @@ -206,13 +206,9 @@ <primitive-type name="bool" target-lang-api-name="PyBool"> <conversion-rule> - <native-to-target> - return PyBool_FromLong((bool)%in); - </native-to-target> + <native-to-target file="../glue/qtcore.cpp" snippet="return-pybool"/> <target-to-native> - <add-conversion type="PyBool"> - %out = %OUTTYPE(%in == Py_True); - </add-conversion> + <add-conversion type="PyBool" file="../glue/qtcore.cpp" snippet="conversion-pybool"/> </target-to-native> </conversion-rule> </primitive-type> @@ -220,37 +216,25 @@ <!-- Qt5: add the new pointer-ish types --> <primitive-type name="qintptr" target-lang-api-name="PyLong"> <conversion-rule> - <native-to-target> - return PyLong_FromLong(%in); - </native-to-target> + <native-to-target file="../glue/qtcore.cpp" snippet="return-pylong"/> <target-to-native> - <add-conversion type="PyLong"> - %out = %OUTTYPE(PyLong_AsLong(%in)); - </add-conversion> + <add-conversion type="PyLong" file="../glue/qtcore.cpp" snippet="conversion-pylong"/> </target-to-native> </conversion-rule> </primitive-type> <primitive-type name="quintptr" target-lang-api-name="PyLong"> <conversion-rule> - <native-to-target> - return PyLong_FromUnsignedLong(%in); - </native-to-target> + <native-to-target file="../glue/qtcore.cpp" snippet="return-pylong-unsigned"/> <target-to-native> - <add-conversion type="PyLong"> - %out = %OUTTYPE(PyLong_AsUnsignedLong(%in)); - </add-conversion> + <add-conversion type="PyLong" file="../glue/qtcore.cpp" snippet="conversion-pylong-unsigned"/> </target-to-native> </conversion-rule> </primitive-type> <primitive-type name="qptrdiff" target-lang-api-name="PyLong"> <conversion-rule> - <native-to-target> - return PyLong_FromLong(%in); - </native-to-target> + <native-to-target file="../glue/qtcore.cpp" snippet="return-pylong"/> <target-to-native> - <add-conversion type="PyLong"> - %out = %OUTTYPE(PyLong_AsLong(%in)); - </add-conversion> + <add-conversion type="PyLong" file="../glue/qtcore.cpp" snippet="conversion-pylong"/> </target-to-native> </conversion-rule> </primitive-type> @@ -260,201 +244,61 @@ <primitive-type name="QString" target-lang-api-name="PyUnicode"> <include file-name="QString" location="global"/> <conversion-rule> - <native-to-target> - QByteArray ba = %in.toUtf8(); - PyObject *%out = PyUnicode_FromStringAndSize(ba.constData(), ba.size()); - return %out; - </native-to-target> + <native-to-target file="../glue/qtcore.cpp" snippet="return-pyunicode"/> <target-to-native> - <add-conversion type="PyUnicode"> - #ifndef Py_LIMITED_API - Py_UNICODE* unicode = PyUnicode_AS_UNICODE(%in); - # if defined(Py_UNICODE_WIDE) - // cast as Py_UNICODE can be a different type - %out = QString::fromUcs4((const uint*)unicode); - # else - %out = QString::fromUtf16((const ushort*)unicode, PyUnicode_GET_SIZE(%in)); - # endif - #else - wchar_t *temp = PyUnicode_AsWideCharString(%in, NULL); - %out = QString::fromWCharArray(temp); - PyMem_Free(temp); - #endif - </add-conversion> - <add-conversion type="PyString" check="py2kStrCheck(%in)"> - #ifndef IS_PY3K - const char* str = %CONVERTTOCPP[const char*](%in); - %out = %OUTTYPE(str); - #endif - </add-conversion> - <add-conversion type="Py_None"> - %out = %OUTTYPE(); - </add-conversion> + <add-conversion type="PyUnicode" file="../glue/qtcore.cpp" snippet="conversion-pyunicode"/> + <add-conversion type="PyString" check="py2kStrCheck(%in)" file="../glue/qtcore.cpp" snippet="conversion-pystring"/> + <add-conversion type="Py_None" file="../glue/qtcore.cpp" snippet="conversion-pynone"/> </target-to-native> </conversion-rule> </primitive-type> <primitive-type name="QStringRef"> <conversion-rule> - <native-to-target> - const int N = %in.toString().length(); - wchar_t *str = new wchar_t[N]; - %in.toString().toWCharArray(str); - PyObject *%out = PyUnicode_FromWideChar(str, N); - delete[] str; - return %out; - </native-to-target> + <native-to-target file="../glue/qtcore.cpp" snippet="return-pyunicode-qstringref"/> </conversion-rule> </primitive-type> <primitive-type name="QChar"> <conversion-rule> - <native-to-target> - wchar_t c = (wchar_t)%in.unicode(); - return PyUnicode_FromWideChar(&c, 1); - </native-to-target> + <native-to-target file="../glue/qtcore.cpp" snippet="return-pyunicode-qchar"/> <target-to-native> - <add-conversion type="PyString" check="Shiboken::String::checkChar(%in)"> - char c = %CONVERTTOCPP[char](%in); - %out = %OUTTYPE(c); - </add-conversion> - <add-conversion type="PyInt"> - int i = %CONVERTTOCPP[int](%in); - %out = %OUTTYPE(i); - </add-conversion> - <add-conversion type="Py_None"> - %out = %OUTTYPE(); - </add-conversion> + <add-conversion type="PyString" check="Shiboken::String::checkChar(%in)" file="../glue/qtcore.cpp" snippet="conversion-pystring-char"/> + <add-conversion type="PyInt" file="../glue/qtcore.cpp" snippet="conversion-pyint"/> + <add-conversion type="Py_None" file="../glue/qtcore.cpp" snippet="conversion-pynone"/> </target-to-native> </conversion-rule> </primitive-type> <primitive-type name="QVariant" target-lang-api-name="PyObject"> <conversion-rule> - <native-to-target> - if (!%in.isValid()) - Py_RETURN_NONE; - - if (qstrcmp(%in.typeName(), "QVariantList") == 0) { - QList<QVariant> var = %in.value<QVariantList>(); - return %CONVERTTOPYTHON[QList<QVariant>](var); - } - - if (qstrcmp(%in.typeName(), "QStringList") == 0) { - QStringList var = %in.value<QStringList>(); - return %CONVERTTOPYTHON[QList<QString>](var); - } - - if (qstrcmp(%in.typeName(), "QVariantMap") == 0) { - QMap<QString, QVariant> var = %in.value<QVariantMap>(); - return %CONVERTTOPYTHON[QMap<QString, QVariant>](var); - } - - Shiboken::Conversions::SpecificConverter converter(cppInRef.typeName()); - if (converter) { - void *ptr = cppInRef.data(); - return converter.toPython(ptr); - } - PyErr_Format(PyExc_RuntimeError, "Can't find converter for '%s'.", %in.typeName()); - return 0; - </native-to-target> + <native-to-target file="../glue/qtcore.cpp" snippet="return-qvariant"/> <target-to-native> - <add-conversion type="PyBool"> - %out = %OUTTYPE(%in == Py_True); - </add-conversion> - <add-conversion type="Py_None"> - %out = %OUTTYPE(); - </add-conversion> - <add-conversion type="QString" check="Shiboken::String::check(%in)"> - QString in = %CONVERTTOCPP[QString](%in); - %out = %OUTTYPE(in); - </add-conversion> - <add-conversion type="QByteArray"> - QByteArray in = %CONVERTTOCPP[QByteArray](%in); - %out = %OUTTYPE(in); - </add-conversion> - <add-conversion type="PyFloat" check="PyFloat_CheckExact(%in)"> - double in = %CONVERTTOCPP[double](%in); - %out = %OUTTYPE(in); - </add-conversion> + <add-conversion type="PyBool" file="../glue/qtcore.cpp" snippet="conversion-pybool"/> + <add-conversion type="Py_None" file="../glue/qtcore.cpp" snippet="conversion-pynone"/> + <add-conversion type="QString" check="Shiboken::String::check(%in)" file="../glue/qtcore.cpp" snippet="conversion-qstring"/> + <add-conversion type="QByteArray" file="../glue/qtcore.cpp" snippet="conversion-qbytearray"/> + <add-conversion type="PyFloat" check="PyFloat_CheckExact(%in)" file="../glue/qtcore.cpp" snippet="conversion-pyfloat"/> <!-- Using PyLong instead of PyInt to support Python2 and 3--> - <add-conversion type="PyInt" check="PyInt_CheckExact(%in)"> - qlonglong in = %CONVERTTOCPP[qlonglong](%in); - %out = %OUTTYPE(in); - </add-conversion> - <add-conversion type="PyLong" check="PyLong_CheckExact(%in)"> - qlonglong in = %CONVERTTOCPP[qlonglong](%in); - %out = %OUTTYPE(in); - </add-conversion> - <add-conversion type="SbkEnumType"> - int in = %CONVERTTOCPP[int](%in); - %out = %OUTTYPE(in); - </add-conversion> - <add-conversion type="SbkObject"> - // a class supported by QVariant? - int typeCode; - const char *typeName = QVariant_resolveMetaType(Py_TYPE(%in), &typeCode); - if (!typeCode || !typeName) - return; - QVariant var(typeCode, (void*)0); - Shiboken::Conversions::SpecificConverter converter(typeName); - converter.toCpp(pyIn, var.data()); - %out = var; - </add-conversion> - <add-conversion type="PyDict" check="PyDict_CheckExact(%in)"> - QVariant ret = QVariant_convertToVariantMap(%in); - %out = ret.isValid() ? ret : QVariant::fromValue(PySide::PyObjectWrapper(%in)); - </add-conversion> - <add-conversion type="PyList" check="PyList_Check(%in)"> - QVariant ret = QVariant_convertToVariantList(%in); - %out = ret.isValid() ? ret : QVariant::fromValue(PySide::PyObjectWrapper(%in)); - </add-conversion> - <add-conversion type="PyObject"> - // Is a shiboken type not known by Qt - %out = QVariant::fromValue(PySide::PyObjectWrapper(%in)); - </add-conversion> + <add-conversion type="PyInt" check="PyInt_CheckExact(%in)" file="../glue/qtcore.cpp" snippet="conversion-qlonglong"/> + <add-conversion type="PyLong" check="PyLong_CheckExact(%in)" file="../glue/qtcore.cpp" snippet="conversion-qlonglong"/> + <add-conversion type="SbkEnumType" file="../glue/qtcore.cpp" snippet="conversion-pyint"/> + <add-conversion type="SbkObject" file="../glue/qtcore.cpp" snippet="conversion-sbkobject"/> + <add-conversion type="PyDict" check="PyDict_CheckExact(%in)" file="../glue/qtcore.cpp" snippet="conversion-pydict"/> + <add-conversion type="PyList" check="PyList_Check(%in)" file="../glue/qtcore.cpp" snippet="conversion-pylist"/> + <add-conversion type="PyObject" file="../glue/qtcore.cpp" snippet="conversion-pyobject"/> </target-to-native> </conversion-rule> </primitive-type> <inject-code class="native" position="beginning" file="../glue/qtcore.cpp" snippet="qvariant-conversion"/> <primitive-type name="QVariant::Type" default-constructor="QVariant::Invalid"> <conversion-rule> - <native-to-target> - const char *typeName = QVariant::typeToName(%in); - PyObject *%out; - PyTypeObject *pyType = nullptr; - if (typeName) - pyType = Shiboken::Conversions::getPythonTypeObject(typeName); - %out = pyType ? (reinterpret_cast<PyObject*>(pyType)) : Py_None; - Py_INCREF(%out); - return %out; - </native-to-target> + <native-to-target file="../glue/qtcore.cpp" snippet="return-qvariant-type"/> <target-to-native> - <add-conversion type="Py_None"> - %out = QVariant::Invalid; - </add-conversion> - <add-conversion type="PyTypeObject"> - const char *typeName; - if (Shiboken::String::checkType(reinterpret_cast<PyTypeObject *>(%in))) - typeName = "QString"; - else if (%in == reinterpret_cast<PyObject*>(&PyFloat_Type)) - typeName = "double"; // float is a UserType in QVariant. - else if (%in == reinterpret_cast<PyObject*>(&PyLong_Type)) - typeName = "int"; // long is a UserType in QVariant. - else if (Py_TYPE(%in) == SbkObjectType_TypeF()) - typeName = Shiboken::ObjectType::getOriginalName((SbkObjectType*)%in); - else - typeName = reinterpret_cast<PyTypeObject *>(%in)->tp_name; - %out = QVariant::nameToType(typeName); - </add-conversion> - <add-conversion type="PyString" check="Shiboken::String::check(%in)"> - %out = QVariant::nameToType(Shiboken::String::toCString(%in)); - </add-conversion> - <add-conversion type="PyDict" check="PyDict_Check(%in) && QVariantType_checkAllStringKeys(%in)"> - %out = QVariant::nameToType("QVariantMap"); - </add-conversion> - <add-conversion type="PySequence"> - %out = QVariantType_isStringList(%in) ? QVariant::StringList : QVariant::List; - </add-conversion> + <add-conversion type="Py_None" file="../glue/qtcore.cpp" snippet="conversion-qvariant-invalid"/> + <add-conversion type="PyTypeObject" file="../glue/qtcore.cpp" snippet="conversion-qvariant-pytypeobject"/> + <add-conversion type="PyString" check="Shiboken::String::check(%in)" file="../glue/qtcore.cpp" snippet="conversion-qvariant-pystring"/> + <add-conversion type="PyDict" check="PyDict_Check(%in) && QVariantType_checkAllStringKeys(%in)" file="../glue/qtcore.cpp" snippet="conversion-qvariant-pydict"/> + <add-conversion type="PySequence" file="../glue/qtcore.cpp" snippet="conversion-qvariant-pysequence"/> </target-to-native> </conversion-rule> </primitive-type> @@ -515,22 +359,9 @@ <primitive-type name="QJsonObject"> <conversion-rule> - <native-to-target> - // The QVariantMap returned by QJsonObject seems to cause a segfault, so - // using QJsonObject.toVariantMap() won't work. - // Wrapping it in a QJsonValue first allows it to work - QJsonValue val(%in); - QVariant ret = val.toVariant(); - - return %CONVERTTOPYTHON[QVariant](ret); - </native-to-target> + <native-to-target file="../glue/qtcore.cpp" snippet="return-qjsonobject"/> <target-to-native> - <add-conversion type="PyDict"> - QVariant dict = QVariant_convertToVariantMap(%in); - QJsonValue val = QJsonValue::fromVariant(dict); - - %out = val.toObject(); - </add-conversion> + <add-conversion type="PyDict" file="../glue/qtcore.cpp" snippet="conversion-qjsonobject-pydict"/> </target-to-native> </conversion-rule> </primitive-type> @@ -683,17 +514,9 @@ <container-type name="QPair" type="pair"> <include file-name="QPair" location="global"/> <conversion-rule> - <native-to-target> - PyObject *%out = PyTuple_New(2); - PyTuple_SET_ITEM(%out, 0, %CONVERTTOPYTHON[%INTYPE_0](%in.first)); - PyTuple_SET_ITEM(%out, 1, %CONVERTTOPYTHON[%INTYPE_1](%in.second)); - return %out; - </native-to-target> + <native-to-target file="../glue/qtcore.cpp" snippet="return-qpair"/> <target-to-native> - <add-conversion type="PySequence"> - %out.first = %CONVERTTOCPP[%OUTTYPE_0](PySequence_Fast_GET_ITEM(%in, 0)); - %out.second = %CONVERTTOCPP[%OUTTYPE_1](PySequence_Fast_GET_ITEM(%in, 1)); - </add-conversion> + <add-conversion type="PySequence" file="../glue/qtcore.cpp" snippet="conversion-qpair-pysequence"/> </target-to-native> </conversion-rule> </container-type> @@ -995,15 +818,8 @@ </inject-code> <conversion-rule> <target-to-native> - <add-conversion type="Py_None"> - %out = %OUTTYPE(); - </add-conversion> - <add-conversion type="PyDate" check="PyDateTime_ImportAndCheck(%in)"> - int day = PyDateTime_GET_DAY(%in); - int month = PyDateTime_GET_MONTH(%in); - int year = PyDateTime_GET_YEAR(%in); - %out = %OUTTYPE(year, month, day); - </add-conversion> + <add-conversion type="Py_None" file="../glue/qtcore.cpp" snippet="conversion-pynone"/> + <add-conversion type="PyDate" check="PyDateTime_ImportAndCheck(%in)" file="../glue/qtcore.cpp" snippet="conversion-qdate-pydate"/> </target-to-native> </conversion-rule> <extra-includes> @@ -1063,19 +879,8 @@ </inject-code> <conversion-rule> <target-to-native> - <add-conversion type="Py_None"> - %out = %OUTTYPE(); - </add-conversion> - <add-conversion type="PyDateTime" check="PyDateTime_ImportAndCheck(%in)"> - int day = PyDateTime_GET_DAY(%in); - int month = PyDateTime_GET_MONTH(%in); - int year = PyDateTime_GET_YEAR(%in); - int hour = PyDateTime_DATE_GET_HOUR(%in); - int min = PyDateTime_DATE_GET_MINUTE(%in); - int sec = PyDateTime_DATE_GET_SECOND(%in); - int usec = PyDateTime_DATE_GET_MICROSECOND(%in); - %out = %OUTTYPE(QDate(year, month, day), QTime(hour, min, sec, usec/1000)); - </add-conversion> + <add-conversion type="Py_None" file="../glue/qtcore.cpp" snippet="conversion-pynone"/> + <add-conversion type="PyDateTime" check="PyDateTime_ImportAndCheck(%in)" file="../glue/qtcore.cpp" snippet="conversion-qdatetime-pydatetime"/> </target-to-native> </conversion-rule> <extra-includes> @@ -1398,16 +1203,8 @@ </inject-code> <conversion-rule> <target-to-native> - <add-conversion type="Py_None"> - %out = %OUTTYPE(); - </add-conversion> - <add-conversion type="PyTime" check="PyDateTime_ImportAndCheck(%in)"> - int hour = PyDateTime_TIME_GET_HOUR(%in); - int min = PyDateTime_TIME_GET_MINUTE(%in); - int sec = PyDateTime_TIME_GET_SECOND(%in); - int usec = PyDateTime_TIME_GET_MICROSECOND(%in); - %out = %OUTTYPE(hour, min, sec, usec/1000); - </add-conversion> + <add-conversion type="Py_None" file="../glue/qtcore.cpp" snippet="conversion-pynone"/> + <add-conversion type="PyTime" check="PyDateTime_ImportAndCheck(%in)" file="../glue/qtcore.cpp" snippet="conversion-qtime-pytime"/> </target-to-native> </conversion-rule> @@ -2045,22 +1842,10 @@ <enum-type name="Base64Option" flags="Base64Options" since="5.2"/> <conversion-rule> <target-to-native> - <add-conversion type="Py_None"> - %out = %OUTTYPE(); - </add-conversion> - <add-conversion type="PyBytes"> - #ifdef IS_PY3K - %out = %OUTTYPE(PyBytes_AS_STRING(%in), PyBytes_GET_SIZE(%in)); - #else - %out = %OUTTYPE(Shiboken::String::toCString(%in), Shiboken::String::len(%in)); - #endif - </add-conversion> - <add-conversion type="PyByteArray"> - %out = %OUTTYPE(PyByteArray_AsString(%in), PyByteArray_Size(%in)); - </add-conversion> - <add-conversion type="PyString" check="Shiboken::String::check(%in) && !PyUnicode_Check(%in)"> - %out = %OUTTYPE(Shiboken::String::toCString(%in), Shiboken::String::len(%in)); - </add-conversion> + <add-conversion type="Py_None" file="../glue/qtcore.cpp" snippet="conversion-pynone"/> + <add-conversion type="PyBytes" file="../glue/qtcore.cpp" snippet="conversion-qbytearray-pybytes"/> + <add-conversion type="PyByteArray" file="../glue/qtcore.cpp" snippet="conversion-qbytearray-pybytearray"/> + <add-conversion type="PyString" check="Shiboken::String::check(%in) && !PyUnicode_Check(%in)" file="../glue/qtcore.cpp" snippet="conversion-qbytearray-pystring"/> </target-to-native> </conversion-rule> diff --git a/sources/pyside2/PySide2/QtGui/typesystem_gui_common.xml b/sources/pyside2/PySide2/QtGui/typesystem_gui_common.xml index 090b7a4ec..f417b8e74 100644 --- a/sources/pyside2/PySide2/QtGui/typesystem_gui_common.xml +++ b/sources/pyside2/PySide2/QtGui/typesystem_gui_common.xml @@ -203,13 +203,9 @@ <primitive-type name="WId" target-lang-api-name="PyLong"> <conversion-rule> - <native-to-target> - return PyLong_FromVoidPtr(reinterpret_cast<void *>(%in)); - </native-to-target> + <native-to-target file="../glue/qtgui.cpp" snippet="return-pylong-voidptr"/> <target-to-native> - <add-conversion type="PyLong"> - %out = reinterpret_cast<%OUTTYPE>(PyLong_AsVoidPtr(%in)); - </add-conversion> + <add-conversion type="PyLong" file="../glue/qtgui.cpp" snippet="conversion-pylong"/> </target-to-native> </conversion-rule> </primitive-type> diff --git a/sources/pyside2/PySide2/glue/qtcore.cpp b/sources/pyside2/PySide2/glue/qtcore.cpp index 084004ceb..73b9476d1 100644 --- a/sources/pyside2/PySide2/glue/qtcore.cpp +++ b/sources/pyside2/PySide2/glue/qtcore.cpp @@ -37,6 +37,10 @@ ** ****************************************************************************/ +/********************************************************************* + * INJECT CODE + ********************************************************************/ + // @snippet include-pyside #include <pyside.h> // @snippet include-pyside @@ -1034,3 +1038,278 @@ QT_END_NAMESPACE (*%CPPSELF) >> _cpp_result; %PYARG_0 = %CONVERTTOPYTHON[%RETURN_TYPE](_cpp_result); // @snippet stream-read-method + +/********************************************************************* + * CONVERSIONS + ********************************************************************/ + +// @snippet conversion-pybool +%out = %OUTTYPE(%in == Py_True); +// @snippet conversion-pybool + +// @snippet conversion-pylong +%out = %OUTTYPE(PyLong_AsLong(%in)); +// @snippet conversion-pylong + +// @snippet conversion-pylong-unsigned +%out = %OUTTYPE(PyLong_AsUnsignedLong(%in)); +// @snippet conversion-pylong-unsigned + +// @snippet conversion-pyunicode +#ifndef Py_LIMITED_API +Py_UNICODE* unicode = PyUnicode_AS_UNICODE(%in); +# if defined(Py_UNICODE_WIDE) +// cast as Py_UNICODE can be a different type +%out = QString::fromUcs4((const uint*)unicode); +# else +%out = QString::fromUtf16((const ushort*)unicode, PyUnicode_GET_SIZE(%in)); +# endif +#else +wchar_t *temp = PyUnicode_AsWideCharString(%in, NULL); +%out = QString::fromWCharArray(temp); +PyMem_Free(temp); +#endif +// @snippet conversion-pyunicode + +// @snippet conversion-pystring +#ifndef IS_PY3K +const char* str = %CONVERTTOCPP[const char*](%in); +%out = %OUTTYPE(str); +#endif +// @snippet conversion-pystring + +// @snippet conversion-pynone +%out = %OUTTYPE(); +// @snippet conversion-pynone + +// @snippet conversion-pystring-char +char c = %CONVERTTOCPP[char](%in); +%out = %OUTTYPE(c); +// @snippet conversion-pystring-char + +// @snippet conversion-pyint +int i = %CONVERTTOCPP[int](%in); +%out = %OUTTYPE(i); +// @snippet conversion-pyint + +// @snippet conversion-qlonglong +qlonglong in = %CONVERTTOCPP[qlonglong](%in); +%out = %OUTTYPE(in); +// @snippet conversion-qlonglong + +// @snippet conversion-qstring +QString in = %CONVERTTOCPP[QString](%in); +%out = %OUTTYPE(in); +// @snippet conversion-qstring + +// @snippet conversion-qbytearray +QByteArray in = %CONVERTTOCPP[QByteArray](%in); +%out = %OUTTYPE(in); +// @snippet conversion-qbytearray + +// @snippet conversion-pyfloat +double in = %CONVERTTOCPP[double](%in); +%out = %OUTTYPE(in); +// @snippet conversion-pyfloat + +// @snippet conversion-sbkobject +// a class supported by QVariant? +int typeCode; +const char *typeName = QVariant_resolveMetaType(Py_TYPE(%in), &typeCode); +if (!typeCode || !typeName) + return; +QVariant var(typeCode, (void*)0); +Shiboken::Conversions::SpecificConverter converter(typeName); +converter.toCpp(pyIn, var.data()); +%out = var; +// @snippet conversion-sbkobject + +// @snippet conversion-pydict +QVariant ret = QVariant_convertToVariantMap(%in); +%out = ret.isValid() ? ret : QVariant::fromValue(PySide::PyObjectWrapper(%in)); +// @snippet conversion-pydict + +// @snippet conversion-pylist +QVariant ret = QVariant_convertToVariantList(%in); +%out = ret.isValid() ? ret : QVariant::fromValue(PySide::PyObjectWrapper(%in)); +// @snippet conversion-pylist + +// @snippet conversion-pyobject +// Is a shiboken type not known by Qt +%out = QVariant::fromValue(PySide::PyObjectWrapper(%in)); +// @snippet conversion-pyobject + +// @snippet conversion-qvariant-invalid +%out = QVariant::Invalid; +// @snippet conversion-qvariant-invalid + +// @snippet conversion-qvariant-pytypeobject +const char *typeName; +if (Shiboken::String::checkType(reinterpret_cast<PyTypeObject *>(%in))) + typeName = "QString"; +else if (%in == reinterpret_cast<PyObject*>(&PyFloat_Type)) + typeName = "double"; // float is a UserType in QVariant. +else if (%in == reinterpret_cast<PyObject*>(&PyLong_Type)) + typeName = "int"; // long is a UserType in QVariant. +else if (Py_TYPE(%in) == SbkObjectType_TypeF()) + typeName = Shiboken::ObjectType::getOriginalName((SbkObjectType*)%in); +else + typeName = reinterpret_cast<PyTypeObject *>(%in)->tp_name; +%out = QVariant::nameToType(typeName); +// @snippet conversion-qvariant-pytypeobject + +// @snippet conversion-qvariant-pystring +%out = QVariant::nameToType(Shiboken::String::toCString(%in)); +// @snippet conversion-qvariant-pystring + +// @snippet conversion-qvariant-pydict +%out = QVariant::nameToType("QVariantMap"); +// @snippet conversion-qvariant-pydict + +// @snippet conversion-qvariant-pysequence +%out = QVariantType_isStringList(%in) ? QVariant::StringList : QVariant::List; +// @snippet conversion-qvariant-pysequence + +// @snippet conversion-qjsonobject-pydict +QVariant dict = QVariant_convertToVariantMap(%in); +QJsonValue val = QJsonValue::fromVariant(dict); +%out = val.toObject(); +// @snippet conversion-qjsonobject-pydict + +// @snippet conversion-qpair-pysequence +%out.first = %CONVERTTOCPP[%OUTTYPE_0](PySequence_Fast_GET_ITEM(%in, 0)); +%out.second = %CONVERTTOCPP[%OUTTYPE_1](PySequence_Fast_GET_ITEM(%in, 1)); +// @snippet conversion-qpair-pysequence + +// @snippet conversion-qdate-pydate +int day = PyDateTime_GET_DAY(%in); +int month = PyDateTime_GET_MONTH(%in); +int year = PyDateTime_GET_YEAR(%in); +%out = %OUTTYPE(year, month, day); +// @snippet conversion-qdate-pydate + +// @snippet conversion-qdatetime-pydatetime +int day = PyDateTime_GET_DAY(%in); +int month = PyDateTime_GET_MONTH(%in); +int year = PyDateTime_GET_YEAR(%in); +int hour = PyDateTime_DATE_GET_HOUR(%in); +int min = PyDateTime_DATE_GET_MINUTE(%in); +int sec = PyDateTime_DATE_GET_SECOND(%in); +int usec = PyDateTime_DATE_GET_MICROSECOND(%in); +%out = %OUTTYPE(QDate(year, month, day), QTime(hour, min, sec, usec/1000)); +// @snippet conversion-qdatetime-pydatetime + +// @snippet conversion-qtime-pytime +int hour = PyDateTime_TIME_GET_HOUR(%in); +int min = PyDateTime_TIME_GET_MINUTE(%in); +int sec = PyDateTime_TIME_GET_SECOND(%in); +int usec = PyDateTime_TIME_GET_MICROSECOND(%in); +%out = %OUTTYPE(hour, min, sec, usec/1000); +// @snippet conversion-qtime-pytime + +// @snippet conversion-qbytearray-pybytes +#ifdef IS_PY3K +%out = %OUTTYPE(PyBytes_AS_STRING(%in), PyBytes_GET_SIZE(%in)); +#else +%out = %OUTTYPE(Shiboken::String::toCString(%in), Shiboken::String::len(%in)); +#endif +// @snippet conversion-qbytearray-pybytes + +// @snippet conversion-qbytearray-pybytearray +%out = %OUTTYPE(PyByteArray_AsString(%in), PyByteArray_Size(%in)); +// @snippet conversion-qbytearray-pybytearray + +// @snippet conversion-qbytearray-pystring +%out = %OUTTYPE(Shiboken::String::toCString(%in), Shiboken::String::len(%in)); +// @snippet conversion-qbytearray-pystring + +/********************************************************************* + * NATIVE TO TARGET CONVERSIONS + ********************************************************************/ + +// @snippet return-pybool +return PyBool_FromLong((bool)%in); +// @snippet return-pybool + +// @snippet return-pylong +return PyLong_FromLong(%in); +// @snippet return-pylong + +// @snippet return-pylong-unsigned +return PyLong_FromUnsignedLong(%in); +// @snippet return-pylong-unsigned + +// @snippet return-pyunicode +QByteArray ba = %in.toUtf8(); +return PyUnicode_FromStringAndSize(ba.constData(), ba.size()); +// @snippet return-pyunicode + +// @snippet return-pyunicode-qstringref + const int N = %in.length(); + wchar_t *str = new wchar_t[N]; + %in.toString().toWCharArray(str); + PyObject *%out = PyUnicode_FromWideChar(str, N); + delete[] str; + return %out; +// @snippet return-pyunicode-qstringref + +// @snippet return-pyunicode-qchar +wchar_t c = (wchar_t)%in.unicode(); +return PyUnicode_FromWideChar(&c, 1); +// @snippet return-pyunicode-qchar + +// @snippet return-qvariant +if (!%in.isValid()) + Py_RETURN_NONE; + +if (qstrcmp(%in.typeName(), "QVariantList") == 0) { + QList<QVariant> var = %in.value<QVariantList>(); + return %CONVERTTOPYTHON[QList<QVariant>](var); +} + +if (qstrcmp(%in.typeName(), "QStringList") == 0) { + QStringList var = %in.value<QStringList>(); + return %CONVERTTOPYTHON[QList<QString>](var); +} + +if (qstrcmp(%in.typeName(), "QVariantMap") == 0) { + QMap<QString, QVariant> var = %in.value<QVariantMap>(); + return %CONVERTTOPYTHON[QMap<QString, QVariant>](var); +} + +Shiboken::Conversions::SpecificConverter converter(cppInRef.typeName()); +if (converter) { + void *ptr = cppInRef.data(); + return converter.toPython(ptr); +} +PyErr_Format(PyExc_RuntimeError, "Can't find converter for '%s'.", %in.typeName()); +return 0; +// @snippet return-qvariant + +// @snippet return-qvariant-type +const char *typeName = QVariant::typeToName(%in); +PyObject *%out; +PyTypeObject *pyType = nullptr; +if (typeName) + pyType = Shiboken::Conversions::getPythonTypeObject(typeName); +%out = pyType ? (reinterpret_cast<PyObject*>(pyType)) : Py_None; +Py_INCREF(%out); +return %out; +// @snippet return-qvariant-type + +// @snippet return-qjsonobject +// The QVariantMap returned by QJsonObject seems to cause a segfault, so +// using QJsonObject.toVariantMap() won't work. +// Wrapping it in a QJsonValue first allows it to work +QJsonValue val(%in); +QVariant ret = val.toVariant(); + +return %CONVERTTOPYTHON[QVariant](ret); +// @snippet return-qjsonobject + +// @snippet return-qpair +PyObject *%out = PyTuple_New(2); +PyTuple_SET_ITEM(%out, 0, %CONVERTTOPYTHON[%INTYPE_0](%in.first)); +PyTuple_SET_ITEM(%out, 1, %CONVERTTOPYTHON[%INTYPE_1](%in.second)); +return %out; +// @snippet return-qpair diff --git a/sources/pyside2/PySide2/glue/qtgui.cpp b/sources/pyside2/PySide2/glue/qtgui.cpp index b308d7ff1..759d0a85a 100644 --- a/sources/pyside2/PySide2/glue/qtgui.cpp +++ b/sources/pyside2/PySide2/glue/qtgui.cpp @@ -37,6 +37,10 @@ ** ****************************************************************************/ +/********************************************************************* + * INJECT CODE + ********************************************************************/ + // @snippet qtransform-quadtoquad QTransform _result; if (QTransform::quadToQuad(%1, %2, _result)) { @@ -492,8 +496,18 @@ if (!PyTuple_SetItem(empty, 0, PyList_New(0))) { } // @snippet qguiapplication-2 -// @snippet qtransform-quadtoquad -// @snippet qtransform-quadtoquad +/********************************************************************* + * CONVERSIONS + ********************************************************************/ -// @snippet qtransform-quadtosquare -// @snippet qtransform-quadtosquare +// @snippet conversion-pylong +%out = reinterpret_cast<%OUTTYPE>(PyLong_AsVoidPtr(%in)); +// @snippet conversion-pylong + +/********************************************************************* + * NATIVE TO TARGET CONVERSIONS + ********************************************************************/ + +// @snippet return-pylong-voidptr +return PyLong_FromVoidPtr(reinterpret_cast<void *>(%in)); +// @snippet return-pylong-voidptr diff --git a/sources/pyside2/PySide2/glue/qtwidgets.cpp b/sources/pyside2/PySide2/glue/qtwidgets.cpp index 2a8a8af0f..7ec0ca266 100644 --- a/sources/pyside2/PySide2/glue/qtwidgets.cpp +++ b/sources/pyside2/PySide2/glue/qtwidgets.cpp @@ -37,6 +37,10 @@ ** ****************************************************************************/ +/********************************************************************* + * INJECT CODE + ********************************************************************/ + // @snippet qtreewidgetitemiterator-next if (**%CPPSELF) { QTreeWidgetItemIterator *%0 = new QTreeWidgetItemIterator((*%CPPSELF)++); @@ -391,3 +395,11 @@ if (_old) %CPPSELF.%FUNCTION_NAME(%1); Shiboken::Object::setParent(%PYSELF, %PYARG_1); // @snippet qgraphicsproxywidget-setwidget + +/********************************************************************* + * CONVERSIONS + ********************************************************************/ + +/********************************************************************* + * NATIVE TO TARGET CONVERSIONS + ********************************************************************/ |