diff options
| -rw-r--r-- | sources/pyside6/PySide6/QtCore/typesystem_core_common.xml | 12 | ||||
| -rw-r--r-- | sources/pyside6/PySide6/glue/qtcore.cpp | 11 | ||||
| -rw-r--r-- | sources/pyside6/tests/QtCore/qmetaobject_test.py | 10 |
3 files changed, 31 insertions, 2 deletions
diff --git a/sources/pyside6/PySide6/QtCore/typesystem_core_common.xml b/sources/pyside6/PySide6/QtCore/typesystem_core_common.xml index 00c84e2ff..b9c35bfe6 100644 --- a/sources/pyside6/PySide6/QtCore/typesystem_core_common.xml +++ b/sources/pyside6/PySide6/QtCore/typesystem_core_common.xml @@ -2981,8 +2981,20 @@ <object-type name="QMessageLogContext"/> <value-type name="QMetaMethod"> + <extra-includes> + <include file-name="pysidesignal.h" location="global"/> + </extra-includes> <enum-type name="Access"/> <enum-type name="MethodType"/> + <add-function signature="fromSignal(PySideSignalInstance@signal@)" + return-type="QMetaMethod" static="true"> + <inject-code class="target" position="beginning" file="../glue/qtcore.cpp" + snippet="qmetamethod-from-signal"/> + <inject-documentation format="target" mode="append"> + Returns the meta-method that corresponds to the given signal, or an invalid QMetaMethod + if signal is not a signal of the class. + </inject-documentation> + </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 c988c131b..1f9278c4b 100644 --- a/sources/pyside6/PySide6/glue/qtcore.cpp +++ b/sources/pyside6/PySide6/glue/qtcore.cpp @@ -1756,3 +1756,14 @@ cptr = new ::%TYPE(%1); // @snippet keycombination-from-modifier cptr = new ::%TYPE(%1, %2); // @snippet keycombination-from-modifier + +// @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{}; +%PYARG_0 = %CONVERTTOPYTHON[QMetaMethod](result); +// @snippet qmetamethod-from-signal diff --git a/sources/pyside6/tests/QtCore/qmetaobject_test.py b/sources/pyside6/tests/QtCore/qmetaobject_test.py index ff320b050..981b2a160 100644 --- a/sources/pyside6/tests/QtCore/qmetaobject_test.py +++ b/sources/pyside6/tests/QtCore/qmetaobject_test.py @@ -13,8 +13,8 @@ sys.path.append(os.fspath(Path(__file__).resolve().parents[1])) from init_paths import init_test_paths init_test_paths(False) -from PySide6.QtCore import (QCoreApplication, QFile, QMetaObject, QObject, - QModelIndex, QPoint, QTimer, QSemaphore, +from PySide6.QtCore import (QCoreApplication, QFile, QMetaMethod, QMetaObject, + QObject, QModelIndex, QPoint, QTimer, QSemaphore, QStringListModel, Qt, Signal, Slot, SIGNAL, Q_ARG, Q_RETURN_ARG) @@ -190,6 +190,12 @@ class qmetaobject_test(unittest.TestCase): Q_ARG("QVariant", "bla")) self.assertEqual(model.data(index), "bla") + def test_QMetaMethod(self): + o = QObject() + m = QMetaMethod.fromSignal(o.destroyed) + self.assertTrue(m.isValid) + self.assertEqual(m.methodSignature(), b"destroyed()") + if __name__ == '__main__': unittest.main() |
