diff options
author | Christian Tismer <tismer@stackless.com> | 2022-11-09 14:21:05 +0100 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2022-11-11 19:20:28 +0000 |
commit | ac8d4682802bf37db4c7a6c0ecf968c09095bfe3 (patch) | |
tree | 733a5aae5174aaea656a88b28b78c382dd541329 | |
parent | 762ccc832c0c72450a430f4ed9e048a795a943c1 (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.cpp | 22 |
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); |