diff options
author | Cristian Maureira-Fredes <cristian.maureira-fredes@qt.io> | 2019-01-08 17:15:24 +0100 |
---|---|---|
committer | Cristián Maureira-Fredes <cristian.maureira-fredes@qt.io> | 2019-07-04 17:21:03 +0200 |
commit | 1b77fc5931bf14b2a9e936a8d08334d9e00ffe7e (patch) | |
tree | aea75020efaee5743a485f47f6ac7ff123c8a2af /sources/pyside2/libpyside/pysidesignal.cpp | |
parent | 8fa674375a3ea5609ffe8dadeb697915347a4072 (diff) |
Add support for parameterNames in Signals
There were many uses cases when a proper interaction
between Python and Qml was needed, one of them was
the case to emit signals from Python an get those values
via an argument name in QML.
A simple example describing this situation can be found
in PYSIDE-634:
Python:
sumResult = Signal(int, arguments=["sum"])
sumResult.emit(42)
Qml:
onSumResult: console.log(sum) // will print 42
A test case based on the same example was added.
Change-Id: I0908f97d88eaadc0c02d81bc4daca936f72f6c6a
Fixes: PYSIDE-634
Reviewed-by: Christian Tismer <tismer@stackless.com>
Diffstat (limited to 'sources/pyside2/libpyside/pysidesignal.cpp')
-rw-r--r-- | sources/pyside2/libpyside/pysidesignal.cpp | 23 |
1 files changed, 21 insertions, 2 deletions
diff --git a/sources/pyside2/libpyside/pysidesignal.cpp b/sources/pyside2/libpyside/pysidesignal.cpp index 169028f0c..47a5fff43 100644 --- a/sources/pyside2/libpyside/pysidesignal.cpp +++ b/sources/pyside2/libpyside/pysidesignal.cpp @@ -203,14 +203,15 @@ PyTypeObject *PySideSignalInstanceTypeF(void) int signalTpInit(PyObject *self, PyObject *args, PyObject *kwds) { static PyObject *emptyTuple = nullptr; - static const char *kwlist[] = {"name", nullptr}; + static const char *kwlist[] = {"name", "arguments", nullptr}; char *argName = nullptr; + PyObject *argArguments = nullptr; if (emptyTuple == 0) emptyTuple = PyTuple_New(0); if (!PyArg_ParseTupleAndKeywords(emptyTuple, kwds, - "|s:QtCore." SIGNAL_CLASS_NAME, const_cast<char **>(kwlist), &argName)) + "|sO:QtCore." SIGNAL_CLASS_NAME, const_cast<char **>(kwlist), &argName, &argArguments)) return 0; bool tupledArgs = false; @@ -220,6 +221,24 @@ int signalTpInit(PyObject *self, PyObject *args, PyObject *kwds) if (argName) data->data->signalName = argName; + data->data->signalArguments = new QByteArrayList(); + if (argArguments && PySequence_Check(argArguments)) { + Py_ssize_t argument_size = PySequence_Size(argArguments); + for (Py_ssize_t i = 0; i < argument_size; ++i) { + PyObject *item = PySequence_GetItem(argArguments, i); +#ifdef IS_PY3K + PyObject *strObj = PyUnicode_AsUTF8String(item); + char *s = PyBytes_AsString(strObj); + Py_DECREF(strObj); +#else + char *s = PyBytes_AsString(item); +#endif + Py_DECREF(item); + if (s != nullptr) + data->data->signalArguments->append(QByteArray(s)); + } + } + for (Py_ssize_t i = 0, i_max = PyTuple_Size(args); i < i_max; i++) { PyObject *arg = PyTuple_GET_ITEM(args, i); if (PySequence_Check(arg) && !Shiboken::String::check(arg)) { |