From dab1576bb10e567f7daf6b66a0c3187775cf9b61 Mon Sep 17 00:00:00 2001 From: Thomas Perl 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]) + }) + } + } +}