diff options
| author | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2023-02-24 11:31:19 +0100 |
|---|---|---|
| committer | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2023-02-27 13:04:41 +0100 |
| commit | 78b924368cc4c82a0cb6b0837f00dcf097d24223 (patch) | |
| tree | 057f7df2ff84f73eb4d23ea499f92173c484f18f | |
| parent | d43163af9c5630aeef67a2494e72009bc18077bb (diff) | |
Add QMetaMethod.fromSignal()
Fixes: PYSIDE-2236
Change-Id: Ibf516529799b35982c8c210f657983d511b622a0
Reviewed-by: Cristian Maureira-Fredes <cristian.maureira-fredes@qt.io>
| -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() |
