Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@qt.io>2024-08-19 15:27:36 +0200
committerFriedemann Kleint <Friedemann.Kleint@qt.io>2024-08-20 11:05:43 +0200
commitac16495bb7f38bfd0aa7bf1a410648220dcee9e1 (patch)
treedadb3330846f204b02ecbeaeff404dec8ec11bce /sources/pyside6/libpyside
parent141d596d1bcf32314802d4269781d2f005ec2278 (diff)
Fix Enum properties for Qt Designer
Split the Enum check function to have an overload for a PyTypeObject * and add a helper function checking whether an enumeration is registered in the Qt meta type system. If so, use its name for the property type. Fixes: PYSIDE-2840 Change-Id: I8253e28d9020dcda9b23d6ad5ddd4e60cd2086d7 Reviewed-by: Cristian Maureira-Fredes <cristian.maureira-fredes@qt.io>
Diffstat (limited to 'sources/pyside6/libpyside')
-rw-r--r--sources/pyside6/libpyside/pysidesignal.cpp22
1 files changed, 21 insertions, 1 deletions
diff --git a/sources/pyside6/libpyside/pysidesignal.cpp b/sources/pyside6/libpyside/pysidesignal.cpp
index b6c9b0b38..13d95fa09 100644
--- a/sources/pyside6/libpyside/pysidesignal.cpp
+++ b/sources/pyside6/libpyside/pysidesignal.cpp
@@ -11,6 +11,7 @@
#include "signalmanager.h"
#include <shiboken.h>
+#include <sbkstaticstrings.h>
#include <QtCore/QByteArray>
#include <QtCore/QDebug>
@@ -20,6 +21,7 @@
#include <QtCore/QMetaObject>
#include <pep384ext.h>
#include <signature.h>
+#include <sbkenum.h>
#include <algorithm>
#include <optional>
@@ -939,6 +941,23 @@ void updateSourceObject(PyObject *source)
return;
}
+// PYSIDE-2840: For an enum registered in Qt, return the C++ name.
+// Ignore flags here; their underlying enums are of Python type flags anyways.
+static QByteArray getQtEnumTypeName(PyTypeObject *type)
+{
+ if (!Shiboken::Enum::checkType(type))
+ return {};
+
+ Shiboken::AutoDecRef qualName(PyObject_GetAttr(reinterpret_cast<PyObject *>(type),
+ Shiboken::PyMagicName::qualname()));
+ QByteArray result = Shiboken::String::toCString(qualName.object());
+ result.replace(".", "::");
+
+ const auto metaType = QMetaType::fromName(result);
+ return metaType.isValid() && metaType.flags().testFlag(QMetaType::IsEnumeration)
+ ? result : QByteArray{};
+}
+
QByteArray getTypeName(PyObject *obType)
{
if (PyType_Check(obType)) {
@@ -958,7 +977,8 @@ QByteArray getTypeName(PyObject *obType)
return QByteArrayLiteral("QVariantList");
if (type == &PyDict_Type)
return QByteArrayLiteral("QVariantMap");
- return QByteArrayLiteral("PyObject");
+ QByteArray enumName = getQtEnumTypeName(type);
+ return enumName.isEmpty() ? "PyObject"_ba : enumName;
}
if (obType == Py_None) // Must be checked before as Shiboken::String::check accepts Py_None
return voidType();