aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@qt.io>2023-07-25 14:50:32 +0200
committerFriedemann Kleint <Friedemann.Kleint@qt.io>2023-07-26 11:45:32 +0200
commit942768a87eaaf4c0ea6a60a1eda06a7aa93859fc (patch)
treed62d9870d24058334124bd85c4bb2802a0bbe82d
parent12ba61a242312edb3fe6a19f9f03f578d55336a5 (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.cpp10
-rw-r--r--sources/pyside6/libpyside/pysidesignal.cpp12
-rw-r--r--sources/pyside6/libpyside/pysidesignal.h12
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
*