diff options
Diffstat (limited to 'sources/pyside6')
| -rw-r--r-- | sources/pyside6/PySide6/QtCore/typesystem_core_common.xml | 65 | ||||
| -rw-r--r-- | sources/pyside6/PySide6/glue/qtcore.cpp | 51 | ||||
| -rw-r--r-- | sources/pyside6/tests/QtCore/qmetaobject_test.py | 21 |
3 files changed, 137 insertions, 0 deletions
diff --git a/sources/pyside6/PySide6/QtCore/typesystem_core_common.xml b/sources/pyside6/PySide6/QtCore/typesystem_core_common.xml index 411f55149..2ef6a25e5 100644 --- a/sources/pyside6/PySide6/QtCore/typesystem_core_common.xml +++ b/sources/pyside6/PySide6/QtCore/typesystem_core_common.xml @@ -3083,7 +3083,10 @@ <value-type name="QMetaMethod"> <extra-includes> <include file-name="pysidesignal.h" location="global"/> + <include file-name="glue/core_snippets_p.h" location="local"/> </extra-includes> + <inject-code class="native" position="beginning" file="../glue/qtcore.cpp" + snippet="qmetamethod-invoke-helpers"/> <enum-type name="Access"/> <enum-type name="MethodType"/> <add-function signature="fromSignal(PySideSignalInstance@signal@)" @@ -3095,6 +3098,68 @@ if signal is not a signal of the class. </inject-documentation> </add-function> + <add-function signature="invoke(QObject*@object@,Qt::ConnectionType@type@, + QtCoreHelper::QGenericReturnArgumentHolder@ret@, + QtCoreHelper::QGenericArgumentHolder@val0@={}, + QtCoreHelper::QGenericArgumentHolder@val1@={}, + QtCoreHelper::QGenericArgumentHolder@val2@={}, + QtCoreHelper::QGenericArgumentHolder@val3@={}, + QtCoreHelper::QGenericArgumentHolder@val4@={}, + QtCoreHelper::QGenericArgumentHolder@val5@={}, + QtCoreHelper::QGenericArgumentHolder@val6@={}, + QtCoreHelper::QGenericArgumentHolder@val7@={}, + QtCoreHelper::QGenericArgumentHolder@val8@={}, + QtCoreHelper::QGenericArgumentHolder@val9@={})" + return-type="PyObject*"> + <inject-code class="target" position="beginning" file="../glue/qtcore.cpp" + snippet="qmetamethod-invoke-conn-type-return-arg"/> + </add-function> + <add-function signature="invoke(QObject*@object@, + QtCoreHelper::QGenericReturnArgumentHolder@ret@, + QtCoreHelper::QGenericArgumentHolder@val0@={}, + QtCoreHelper::QGenericArgumentHolder@val1@={}, + QtCoreHelper::QGenericArgumentHolder@val2@={}, + QtCoreHelper::QGenericArgumentHolder@val3@={}, + QtCoreHelper::QGenericArgumentHolder@val4@={}, + QtCoreHelper::QGenericArgumentHolder@val5@={}, + QtCoreHelper::QGenericArgumentHolder@val6@={}, + QtCoreHelper::QGenericArgumentHolder@val7@={}, + QtCoreHelper::QGenericArgumentHolder@val8@={}, + QtCoreHelper::QGenericArgumentHolder@val9@={})" + return-type="PyObject*"> + <inject-code class="target" position="beginning" file="../glue/qtcore.cpp" + snippet="qmetamethod-invoke-return-arg"/> + </add-function> + <add-function signature="invoke(QObject*@object@,Qt::ConnectionType@type@, + QtCoreHelper::QGenericArgumentHolder@val0@={}, + QtCoreHelper::QGenericArgumentHolder@val1@={}, + QtCoreHelper::QGenericArgumentHolder@val2@={}, + QtCoreHelper::QGenericArgumentHolder@val3@={}, + QtCoreHelper::QGenericArgumentHolder@val4@={}, + QtCoreHelper::QGenericArgumentHolder@val5@={}, + QtCoreHelper::QGenericArgumentHolder@val6@={}, + QtCoreHelper::QGenericArgumentHolder@val7@={}, + QtCoreHelper::QGenericArgumentHolder@val8@={}, + QtCoreHelper::QGenericArgumentHolder@val9@={})" + return-type="PyObject*"> + <inject-code class="target" position="beginning" file="../glue/qtcore.cpp" + snippet="qmetamethod-invoke-conn-type"/> + </add-function> + <add-function signature="invoke(QObject*@object@, + QtCoreHelper::QGenericArgumentHolder@val0@={}, + QtCoreHelper::QGenericArgumentHolder@val1@={}, + QtCoreHelper::QGenericArgumentHolder@val2@={}, + QtCoreHelper::QGenericArgumentHolder@val3@={}, + QtCoreHelper::QGenericArgumentHolder@val4@={}, + QtCoreHelper::QGenericArgumentHolder@val5@={}, + QtCoreHelper::QGenericArgumentHolder@val6@={}, + QtCoreHelper::QGenericArgumentHolder@val7@={}, + QtCoreHelper::QGenericArgumentHolder@val8@={}, + QtCoreHelper::QGenericArgumentHolder@val9@={})" + return-type="PyObject*"> + <inject-code class="target" position="beginning" file="../glue/qtcore.cpp" + snippet="qmetamethod-invoke"/> + </add-function> <!-- This isn't part of Qt public API --> <modify-function signature="attributes()const" remove="all"/> <modify-function signature="getParameterTypes(int*)const" remove="all"/> diff --git a/sources/pyside6/PySide6/glue/qtcore.cpp b/sources/pyside6/PySide6/glue/qtcore.cpp index 0dcd458bd..d0f2e8d6d 100644 --- a/sources/pyside6/PySide6/glue/qtcore.cpp +++ b/sources/pyside6/PySide6/glue/qtcore.cpp @@ -1750,6 +1750,57 @@ QtCoreHelper::QGenericReturnArgumentHolder result(qArgData.metaType, qArgData.da %PYARG_0 = %CONVERTTOPYTHON[QtCoreHelper::QGenericReturnArgumentHolder](result); // @snippet q_return_arg +// @snippet qmetamethod-invoke-helpers +static InvokeMetaMethodFunc + createInvokeMetaMethodFunc(const QMetaMethod &method, QObject *object, + Qt::ConnectionType type = Qt::AutoConnection) +{ + return [&method, object, type](QGenericArgument a0, QGenericArgument a1, + QGenericArgument a2, QGenericArgument a3, + QGenericArgument a4, QGenericArgument a5, + QGenericArgument a6, QGenericArgument a7, + QGenericArgument a8, QGenericArgument a9) -> bool + { + return method.invoke(object, type, a0, a1, a2, a3, a4, a5, a6, a7, a8, a9); + }; +} + +static InvokeMetaMethodFuncWithReturn + createInvokeMetaMethodFuncWithReturn(const QMetaMethod &method, QObject *object, + Qt::ConnectionType type = Qt::AutoConnection) +{ + return [&method, object, type](QGenericReturnArgument r, + QGenericArgument a0, QGenericArgument a1, + QGenericArgument a2, QGenericArgument a3, + QGenericArgument a4, QGenericArgument a5, + QGenericArgument a6, QGenericArgument a7, + QGenericArgument a8, QGenericArgument a9) -> bool + { + return method.invoke(object, type, r, a0, a1, a2, a3, a4, a5, a6, a7, a8, a9); + }; +} +// @snippet qmetamethod-invoke-helpers + +// @snippet qmetamethod-invoke-conn-type-return-arg +%PYARG_0 = invokeMetaMethodWithReturn(createInvokeMetaMethodFuncWithReturn(*%CPPSELF, %1, %2), + %3, %4, %5, %6, %7, %8, %9, %10, %11, %12, %13); +// @snippet qmetamethod-invoke-conn-type-return-arg + +// @snippet qmetamethod-invoke-return-arg +%PYARG_0 = invokeMetaMethodWithReturn(createInvokeMetaMethodFuncWithReturn(*%CPPSELF, %1), + %2, %3, %4, %5, %6, %7, %8, %9, %10, %11, %12); +// @snippet qmetamethod-invoke-return-arg + +// @snippet qmetamethod-invoke-conn-type +%PYARG_0 = invokeMetaMethod(createInvokeMetaMethodFunc(*%CPPSELF, %1, %2), + %3, %4, %5, %6, %7, %8, %9, %10, %11, %12); +// @snippet qmetamethod-invoke-conn-type + +// @snippet qmetamethod-invoke +%PYARG_0 = invokeMetaMethod(createInvokeMetaMethodFunc(*%CPPSELF, %1), + %2, %3, %4, %5, %6, %7, %8, %9, %10, %11); +// @snippet qmetamethod-invoke + // @snippet qmetaobject-invokemethod-helpers static InvokeMetaMethodFunc createInvokeMetaMethodFunc(QObject *object, const char *methodName, diff --git a/sources/pyside6/tests/QtCore/qmetaobject_test.py b/sources/pyside6/tests/QtCore/qmetaobject_test.py index 981b2a160..8f6467a07 100644 --- a/sources/pyside6/tests/QtCore/qmetaobject_test.py +++ b/sources/pyside6/tests/QtCore/qmetaobject_test.py @@ -143,6 +143,17 @@ class qmetaobject_test(unittest.TestCase): Q_ARG(int, 2), Q_ARG(int, 3)) self.assertEqual(sum, 5) + # Same with QMetaMethod + mo = tester.metaObject() + method = mo.method(mo.indexOfMethod("add(int,int)")) + self.assertTrue(method.isValid()) + sum = method.invoke(tester, Qt.ConnectionType.AutoConnection, + Q_RETURN_ARG(int), Q_ARG(int, 2), Q_ARG(int, 3)) + self.assertEqual(sum, 5) + sum = method.invoke(tester, Q_RETURN_ARG(int), Q_ARG(int, 2), + Q_ARG(int, 3)) + self.assertEqual(sum, 5) + concatenated = QMetaObject.invokeMethod(tester, "concatenate", Q_RETURN_ARG(str), Q_ARG(str, "bla"), @@ -190,6 +201,16 @@ class qmetaobject_test(unittest.TestCase): Q_ARG("QVariant", "bla")) self.assertEqual(model.data(index), "bla") + # Same with QMetaMethod + mo = model.metaObject() + method = mo.method(mo.indexOfMethod("setData(QModelIndex,QVariant)")) + self.assertTrue(method.isValid()) + method.invoke(model, Qt.ConnectionType.AutoConnection, + Q_ARG(QModelIndex, index), Q_ARG("QVariant", "blub")) + self.assertEqual(model.data(index), "blub") + method.invoke(model, Q_ARG(QModelIndex, index), Q_ARG("QVariant", "blip")) + self.assertEqual(model.data(index), "blip") + def test_QMetaMethod(self): o = QObject() m = QMetaMethod.fromSignal(o.destroyed) |
