diff options
author | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2020-10-27 08:16:47 +0100 |
---|---|---|
committer | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2020-10-27 09:54:53 +0000 |
commit | 49bd2b28d4a666107d4d124b9a5cc9fbe88d8fe8 (patch) | |
tree | 00cf7e8faba8740fabd39840e652e69c9bb05567 /sources | |
parent | ac2eb96b1983aa09f2d95a060b5dc31df228f33d (diff) |
PySide snippets: Fix deprecation warnings about constructing a QVariant from a type id
Rewrite the helper QVariant_resolveMetaType() to return a QMetaType.
Change-Id: Ifa3994ea0c23149bd925e4a422f19e98e742d97f
Reviewed-by: Christian Tismer <tismer@stackless.com>
Diffstat (limited to 'sources')
-rw-r--r-- | sources/pyside2/PySide2/glue/qtcore.cpp | 62 |
1 files changed, 28 insertions, 34 deletions
diff --git a/sources/pyside2/PySide2/glue/qtcore.cpp b/sources/pyside2/PySide2/glue/qtcore.cpp index e9c60aeac..aa56333f2 100644 --- a/sources/pyside2/PySide2/glue/qtcore.cpp +++ b/sources/pyside2/PySide2/glue/qtcore.cpp @@ -120,43 +120,39 @@ else { // @snippet qsettings-value // @snippet qvariant-conversion -static const char *QVariant_resolveMetaType(PyTypeObject *type, int *typeId) +static QMetaType QVariant_resolveMetaType(PyTypeObject *type) { if (PyObject_TypeCheck(type, SbkObjectType_TypeF())) { auto sbkType = reinterpret_cast<SbkObjectType *>(type); const char *typeName = Shiboken::ObjectType::getOriginalName(sbkType); if (!typeName) - return nullptr; + return {}; const bool valueType = '*' != typeName[qstrlen(typeName) - 1]; // Do not convert user type of value if (valueType && Shiboken::ObjectType::isUserType(type)) - return nullptr; - int obTypeId = QMetaType::fromName(typeName).id(); - if (obTypeId) { - *typeId = obTypeId; - return typeName; - } + return {}; + QMetaType metaType = QMetaType::fromName(typeName); + if (metaType.isValid()) + return metaType; // Do not resolve types to value type if (valueType) - return nullptr; + return {}; // Find in base types. First check tp_bases, and only after check tp_base, because // tp_base does not always point to the first base class, but rather to the first // that has added any python fields or slots to its object layout. // See https://mail.python.org/pipermail/python-list/2009-January/520733.html if (type->tp_bases) { for (int i = 0, size = PyTuple_GET_SIZE(type->tp_bases); i < size; ++i) { - const char *derivedName = QVariant_resolveMetaType(reinterpret_cast<PyTypeObject *>(PyTuple_GET_ITEM( - type->tp_bases, i)), typeId); - if (derivedName) - return derivedName; + auto baseType = reinterpret_cast<PyTypeObject *>(PyTuple_GET_ITEM(type->tp_bases, i)); + const QMetaType derived = QVariant_resolveMetaType(baseType); + if (derived.isValid()) + return derived; } - } - else if (type->tp_base) { - return QVariant_resolveMetaType(type->tp_base, typeId); + } else if (type->tp_base) { + return QVariant_resolveMetaType(type->tp_base); } } - *typeId = 0; - return nullptr; + return {}; } static QVariant QVariant_convertToValueList(PyObject *list) { @@ -167,17 +163,17 @@ static QVariant QVariant_convertToValueList(PyObject *list) } Shiboken::AutoDecRef element(PySequence_GetItem(list, 0)); - int typeId; - const char *typeName = QVariant_resolveMetaType(element.cast<PyTypeObject *>(), &typeId); - if (typeName) { + + const QMetaType metaType = QVariant_resolveMetaType(element.cast<PyTypeObject *>()); + if (metaType.isValid()) { QByteArray listTypeName("QList<"); - listTypeName += typeName; + listTypeName += metaType.name(); listTypeName += '>'; - typeId = QMetaType::fromName(listTypeName).id(); - if (typeId > 0) { + QMetaType metaType = QMetaType::fromName(listTypeName); + if (metaType.isValid()) { Shiboken::Conversions::SpecificConverter converter(listTypeName); if (converter) { - QVariant var(static_cast<QVariant::Type>(typeId)); + QVariant var(metaType); converter.toCpp(list, &var); return var; } @@ -1708,17 +1704,15 @@ double in = %CONVERTTOCPP[double](%in); // @snippet conversion-sbkobject // a class supported by QVariant? -int typeCode; -const char *typeName = QVariant_resolveMetaType(Py_TYPE(%in), &typeCode); -if (!typeCode || !typeName) { - // If the type was not encountered, return a default PyObjectWrapper - %out = QVariant::fromValue(PySide::PyObjectWrapper(%in)); -} -else { - QVariant var(static_cast<QVariant::Type>(typeCode)); - Shiboken::Conversions::SpecificConverter converter(typeName); +const QMetaType metaType = QVariant_resolveMetaType(Py_TYPE(%in)); +if (metaType.isValid()) { + QVariant var(metaType); + Shiboken::Conversions::SpecificConverter converter(metaType.name()); converter.toCpp(pyIn, var.data()); %out = var; +} else { + // If the type was not encountered, return a default PyObjectWrapper + %out = QVariant::fromValue(PySide::PyObjectWrapper(%in)); } // @snippet conversion-sbkobject |