File 0003-Allow-calling-signals-from-Python.patch of Package python3-pyotherside
From dab1576bb10e567f7daf6b66a0c3187775cf9b61 Mon Sep 17 00:00:00 2001
From: Thomas Perl <m@thp.io>
Date: Sun, 27 Jan 2019 12:31:01 +0100
Subject: [PATCH] Allow calling signals from Python (Fixes #98)
---
src/qpython_priv.cpp | 14 +++++++++++++
tests/test_call_signal/TestModule.py | 5 +++++
tests/test_call_signal/test.qml | 31 ++++++++++++++++++++++++++++
3 files changed, 50 insertions(+)
create mode 100644 tests/test_call_signal/TestModule.py
create mode 100644 tests/test_call_signal/test.qml
diff --git a/src/qpython_priv.cpp b/src/qpython_priv.cpp
index 7cee0e1..e5d96f1 100644
--- a/src/qpython_priv.cpp
+++ b/src/qpython_priv.cpp
@@ -390,6 +390,20 @@ pyotherside_QObjectMethod_call(PyObject *callable_object, PyObject *args, PyObje
QMetaMethod method = metaObject->method(i);
if (method.name() == ref->method()) {
+ if (method.methodType() == QMetaMethod::Signal) {
+ // Signals can't be called directly, we just return true or
+ // false depending on whether method.invoke() worked or not
+ bool result = method.invoke(o, Qt::AutoConnection,
+ genericArguments.value(0),
+ genericArguments.value(1), genericArguments.value(2),
+ genericArguments.value(3), genericArguments.value(4),
+ genericArguments.value(5), genericArguments.value(6),
+ genericArguments.value(7), genericArguments.value(8),
+ genericArguments.value(9));
+
+ return convertQVariantToPyObject(result);
+ }
+
QVariant result;
if (method.invoke(o, Qt::DirectConnection,
Q_RETURN_ARG(QVariant, result), genericArguments.value(0),
diff --git a/tests/test_call_signal/TestModule.py b/tests/test_call_signal/TestModule.py
new file mode 100644
index 0000000..b55e899
--- /dev/null
+++ b/tests/test_call_signal/TestModule.py
@@ -0,0 +1,5 @@
+import pyotherside
+
+def makeCalls(obj):
+ print(f'result of callFunction: {obj.callFunction()}')
+ print(f'result of callSignal: {obj.callSignal()}')
diff --git a/tests/test_call_signal/test.qml b/tests/test_call_signal/test.qml
new file mode 100644
index 0000000..deb8e40
--- /dev/null
+++ b/tests/test_call_signal/test.qml
@@ -0,0 +1,31 @@
+import QtQuick 2.9
+import io.thp.pyotherside 1.5
+
+Item {
+id: obj
+
+ signal callSignal()
+
+ function callFunction() {
+ print('Function Called')
+ return 'hoho'
+ }
+
+ function signalConnection(){
+ print('Signal Called')
+ }
+
+ Component.onCompleted: {
+ obj.callSignal.connect(signalConnection)
+ }
+
+ Python {
+ Component.onCompleted: {
+ addImportPath(Qt.resolvedUrl('.'));
+
+ importModule('TestModule', function(){
+ call('TestModule.makeCalls', [obj])
+ })
+ }
+ }
+}