aboutsummaryrefslogtreecommitdiffstats
path: root/sources/pyside6/libpysideremoteobjects/pysidedynamicclass.cpp
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@qt.io>2025-11-14 11:44:09 +0100
committerFriedemann Kleint <Friedemann.Kleint@qt.io>2025-11-14 18:14:36 +0100
commitd5a52173d34137ed3ac7ceb3e91bb6dcc20b75a7 (patch)
tree9c198288521b84ac6898a8f787da79d9cc091091 /sources/pyside6/libpysideremoteobjects/pysidedynamicclass.cpp
parent5963ee9a9c830270a4571eb202c117336bc7aefe (diff)
libpyside: Introduce a helper function for creating properties
For use in QtRemoteObjects and Python bridges. Change-Id: Ica4d3c36cc87db958353d7d6de25806acdf5d8b7 Reviewed-by: Cristian Maureira-Fredes <cristian.maureira-fredes@qt.io>
Diffstat (limited to 'sources/pyside6/libpysideremoteobjects/pysidedynamicclass.cpp')
-rw-r--r--sources/pyside6/libpysideremoteobjects/pysidedynamicclass.cpp28
1 files changed, 12 insertions, 16 deletions
diff --git a/sources/pyside6/libpysideremoteobjects/pysidedynamicclass.cpp b/sources/pyside6/libpysideremoteobjects/pysidedynamicclass.cpp
index 30ea9a6d1..17ba5a3a3 100644
--- a/sources/pyside6/libpysideremoteobjects/pysidedynamicclass.cpp
+++ b/sources/pyside6/libpysideremoteobjects/pysidedynamicclass.cpp
@@ -9,6 +9,7 @@
#include "pysidecapsulemethod_p.h"
#include "pysiderephandler_p.h"
+#include <autodecref.h>
#include <basewrapper.h>
#include <sbkpep.h>
#include <sbkconverter.h>
@@ -407,16 +408,14 @@ PyTypeObject *createDynamicClassImpl(QMetaObject *meta)
METH_VARARGS,
nullptr
};
+
+ auto *obType = reinterpret_cast<PyObject *>(type);
for (int i = meta->propertyOffset(); i < meta->propertyCount(); ++i) {
// Create a PropertyCapsule for each property to store the info needed for
// the handler. Assign the __get__ and (if needed) __set__ attributes to a
// PySideProperty which becomes the attribute set on the new type.
auto metaProperty = meta->property(i);
- PyObject *kwds = PyDict_New();
auto metaType = metaProperty.metaType();
- auto *pyPropertyType = PyUnicode_FromString(metaType.name());
- PyDict_SetItemString(kwds, "type", pyPropertyType);
- Py_DECREF(pyPropertyType);
method.ml_name = metaProperty.name();
auto *pc = new PropertyCapsule{metaProperty.name(), i, i - meta->propertyOffset()};
@@ -425,25 +424,22 @@ PyTypeObject *createDynamicClassImpl(QMetaObject *meta)
});
auto capsulePropObject = make_capsule_property(&method, capsule,
metaProperty.isWritable());
- PyObject *fget = PyObject_GetAttrString(capsulePropObject, "__get__");
- PyDict_SetItemString(kwds, "fget", fget);
+ Shiboken::AutoDecRef fget(PyObject_GetAttrString(capsulePropObject, "__get__"));
+ Shiboken::AutoDecRef fset;
+ Shiboken::AutoDecRef notifySignature;
if (metaProperty.isWritable()) {
- PyObject *fset = PyObject_GetAttrString(capsulePropObject, "__set__");
- PyDict_SetItemString(kwds, "fset", fset);
+ fset.reset(PyObject_GetAttrString(capsulePropObject, "__set__"));
if (metaProperty.hasNotifySignal()) {
auto nameString = metaProperty.notifySignal().name();
- auto *notify = PyObject_GetAttrString(reinterpret_cast<PyObject *>(type),
- nameString.constData());
- PyDict_SetItemString(kwds, "notify", notify);
+ notifySignature.reset(PyObject_GetAttrString(obType, nameString.constData()));
}
}
- PyObject *pyProperty = PyObject_Call(reinterpret_cast<PyObject *>(PySideProperty_TypeF()),
- PyTuple_New(0), kwds);
- if (PyObject_SetAttrString(reinterpret_cast<PyObject *>(type),
- metaProperty.name(), pyProperty) < 0) {
+ Shiboken::AutoDecRef pyProperty(PySide::Property::create(metaType.name(), fget, fset, notifySignature));
+ if (pyProperty.isNull()
+ || PyObject_SetAttrString(obType, metaProperty.name(), pyProperty.object()) < 0) {
+ PyErr_Print();
return nullptr;
}
- Py_DECREF(pyProperty);
}
for (int i = meta->methodOffset(); i < meta->methodCount(); ++i) {
// Create a CapsuleMethod for each Slot method to store the info needed