aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--sources/pyside6/PySide6/QtCore/typesystem_core_common.xml12
-rw-r--r--sources/pyside6/PySide6/glue/qtcore.cpp11
-rw-r--r--sources/pyside6/tests/QtCore/qmetaobject_test.py10
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()