diff options
| author | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2023-07-25 14:50:32 +0200 |
|---|---|---|
| committer | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2023-07-26 11:45:32 +0200 |
| commit | 942768a87eaaf4c0ea6a60a1eda06a7aa93859fc (patch) | |
| tree | d62d9870d24058334124bd85c4bb2802a0bbe82d | |
| parent | 12ba61a242312edb3fe6a19f9f03f578d55336a5 (diff) | |
PySide6: Add a convenience function for retrieving signal emitters
Task-number: PYSIDE-2384
Change-Id: I38cd611439a882e65f9f3bc6ca47dedd0a4fc66c
Reviewed-by: Cristian Maureira-Fredes <cristian.maureira-fredes@qt.io>
| -rw-r--r-- | sources/pyside6/PySide6/glue/qtcore.cpp | 10 | ||||
| -rw-r--r-- | sources/pyside6/libpyside/pysidesignal.cpp | 12 | ||||
| -rw-r--r-- | sources/pyside6/libpyside/pysidesignal.h | 12 |
3 files changed, 28 insertions, 6 deletions
diff --git a/sources/pyside6/PySide6/glue/qtcore.cpp b/sources/pyside6/PySide6/glue/qtcore.cpp index 53cf50b22..82d2921e3 100644 --- a/sources/pyside6/PySide6/glue/qtcore.cpp +++ b/sources/pyside6/PySide6/glue/qtcore.cpp @@ -1820,12 +1820,10 @@ cptr = new ::%TYPE(%1, %2); // @snippet qmetamethod-from-signal auto *signalInst = reinterpret_cast<PySideSignalInstance *>(%PYARG_1); -PyObject *emitterPyObject = PySide::Signal::getObject(signalInst); -QObject* emitter = %CONVERTTOCPP[QObject *](emitterPyObject); -const QByteArray signature = PySide::Signal::getSignature(signalInst); -const auto *mo = emitter->metaObject(); -const auto index = mo->indexOfSignal(signature.constData()); -const auto result = index != -1 ? mo->method(index) : QMetaMethod{}; +const auto data = PySide::Signal::getEmitterData(signalInst); +const auto result = data.methodIndex != -1 + ? data.emitter->metaObject()->method(data.methodIndex) + : QMetaMethod{}; %PYARG_0 = %CONVERTTOPYTHON[QMetaMethod](result); // @snippet qmetamethod-from-signal diff --git a/sources/pyside6/libpyside/pysidesignal.cpp b/sources/pyside6/libpyside/pysidesignal.cpp index fc630153c..7625cb4d6 100644 --- a/sources/pyside6/libpyside/pysidesignal.cpp +++ b/sources/pyside6/libpyside/pysidesignal.cpp @@ -4,6 +4,7 @@ #include <sbkpython.h> #include "pysidesignal.h" #include "pysidesignal_p.h" +#include "pysideqobject.h" #include "pysideutils.h" #include "pysidestaticstrings.h" #include "pysideweakref.h" @@ -1163,6 +1164,17 @@ const char *getSignature(PySideSignalInstance *signal) return signal->d->signature; } +EmitterData getEmitterData(PySideSignalInstance *signal) +{ + EmitterData result; + result.emitter = PySide::convertToQObject(getObject(signal), false); + if (result.emitter != nullptr) { + auto *mo = result.emitter->metaObject(); + result.methodIndex = mo->indexOfMethod(getSignature(signal)); + } + return result; +} + QStringList getArgsFromSignature(const char *signature, bool *isShortCircuit) { QString qsignature = QString::fromLatin1(signature).trimmed(); diff --git a/sources/pyside6/libpyside/pysidesignal.h b/sources/pyside6/libpyside/pysidesignal.h index 3b82e6c58..40c8f5a65 100644 --- a/sources/pyside6/libpyside/pysidesignal.h +++ b/sources/pyside6/libpyside/pysidesignal.h @@ -93,6 +93,18 @@ PYSIDE_API PyObject *getObject(PySideSignalInstance *signal); **/ PYSIDE_API const char *getSignature(PySideSignalInstance *signal); +struct EmitterData +{ + QObject *emitter = nullptr; + int methodIndex = -1; +}; + +/// A convenience to retrieve the emitter data from a signal instance +/// +/// @param signal The Signal object +/// @return Data structure +PYSIDE_API EmitterData getEmitterData(PySideSignalInstance *signal); + /** * This function is used to retrieve the signal signature * |
