aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian Tismer <tismer@stackless.com>2022-11-09 14:21:05 +0100
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2022-11-11 19:20:28 +0000
commitac8d4682802bf37db4c7a6c0ecf968c09095bfe3 (patch)
tree733a5aae5174aaea656a88b28b78c382dd541329
parent762ccc832c0c72450a430f4ed9e048a795a943c1 (diff)
signals: Increase compatibility by providing a signatures attribute
[ChangeLog][PySide6] A `signatures` attribute was added to the Signal type in order to increase compatibility with other implementations. Task-number: PYSIDE-1113 Change-Id: I7b97e38feaff5a0db8a82a26f52fb6ecadab08d2 Fixes: PYSIDE-1713 Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io> (cherry picked from commit 1e47cdbd77ed2c95f520aaa8b856bb05f4076a89) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
-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 8a32bf005..15c8dcae1 100644
--- a/sources/pyside6/libpyside/pysidesignal.cpp
+++ b/sources/pyside6/libpyside/pysidesignal.cpp
@@ -106,6 +106,7 @@ static int signalTpInit(PyObject *, PyObject *, PyObject *);
static void signalFree(void *);
static void signalInstanceFree(void *);
static PyObject *signalGetItem(PyObject *self, PyObject *key);
+static PyObject *signalGetAttr(PyObject *self, PyObject *name);
static PyObject *signalToString(PyObject *self);
static PyObject *signalDescrGet(PyObject *self, PyObject *obj, PyObject *type);
@@ -153,6 +154,7 @@ static PyTypeObject *PySideMetaSignal_TypeF(void)
static PyType_Slot PySideSignalType_slots[] = {
{Py_mp_subscript, reinterpret_cast<void *>(signalGetItem)},
+ {Py_tp_getattro, reinterpret_cast<void *>(signalGetAttr)},
{Py_tp_descr_get, reinterpret_cast<void *>(signalDescrGet)},
{Py_tp_call, reinterpret_cast<void *>(signalCall)},
{Py_tp_str, reinterpret_cast<void *>(signalToString)},
@@ -301,12 +303,30 @@ static PyObject *signalGetItem(PyObject *obSelf, PyObject *key)
return Shiboken::String::fromCString(sig.constData());
}
-
static PyObject *signalToString(PyObject *self)
{
return signalGetItem(self, nullptr);
}
+static PyObject *signalGetAttr(PyObject *obSelf, PyObject *name)
+{
+ auto self = reinterpret_cast<PySideSignal *>(obSelf);
+
+ if (PyUnicode_CompareWithASCIIString(name, "signatures") != 0)
+ return PyObject_GenericGetAttr(obSelf, name);
+
+ auto nelems = self->data->signatures.count();
+ PyObject *tuple = PyTuple_New(nelems);
+
+ for (Py_ssize_t idx = 0; idx < nelems; ++idx) {
+ QByteArray sigKey = self->data->signatures.at(idx).signature;
+ auto sig = PySide::Signal::buildSignature(self->data->signalName, sigKey);
+ PyObject *entry = Shiboken::String::fromCString(sig.constData());
+ PyTuple_SetItem(tuple, idx, entry);
+ }
+ return tuple;
+}
+
static void signalInstanceFree(void *vself)
{
auto pySelf = reinterpret_cast<PyObject *>(vself);