aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@qt.io>2022-02-21 13:56:10 +0100
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2022-02-28 20:38:30 +0000
commit49bc88f6e4012f33514cc9b2d3305358a4320c2d (patch)
tree6f0a89cf7875f80970e76e95cf9ea73499cc00f7
parentab7e0fea1e64f4c56073a798bab2068eb6b04722 (diff)
Fix signals/slots with non-QObject object types
Add meta type registrations for pointer types. Fixes: PYSIDE-1827 Change-Id: I771ab6d2c075ec1cb7d9153bc7a8ddc47642dc83 Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io> Reviewed-by: Cristian Maureira-Fredes <cristian.maureira-fredes@qt.io> (cherry picked from commit 9ef3c0041c489bd9f939c45a571026c3e2227685) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
-rw-r--r--sources/pyside6/tests/QtCore/qmetaobject_test.py37
-rw-r--r--sources/shiboken6/generator/shiboken/cppgenerator.cpp6
2 files changed, 41 insertions, 2 deletions
diff --git a/sources/pyside6/tests/QtCore/qmetaobject_test.py b/sources/pyside6/tests/QtCore/qmetaobject_test.py
index 33c35595f..a65a9937d 100644
--- a/sources/pyside6/tests/QtCore/qmetaobject_test.py
+++ b/sources/pyside6/tests/QtCore/qmetaobject_test.py
@@ -40,7 +40,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 QFile, QObject, QTimer, SIGNAL
+from PySide6.QtCore import (QCoreApplication, QFile, QObject, QTimer,
+ QSemaphore, Qt, Signal, Slot, SIGNAL)
class Foo(QFile):
@@ -52,6 +53,28 @@ class DynObject(QObject):
pass
+class SemaphoreSender(QObject):
+ signal = Signal(QSemaphore)
+
+ def __init__(self, parent=None):
+ super().__init__(parent)
+ self.semaphore = QSemaphore()
+
+ def emitSignal(self):
+ self.signal.emit(self.semaphore)
+
+
+class SemaphoreReceiver(QObject):
+
+ def __init__(self, parent=None):
+ super().__init__(parent)
+ self.semaphore = None
+
+ @Slot(QSemaphore)
+ def receiverSlot(self, semaphore):
+ self.semaphore = semaphore
+
+
class qmetaobject_test(unittest.TestCase):
"""
def test_QMetaObject(self):
@@ -95,6 +118,18 @@ class qmetaobject_test(unittest.TestCase):
self.assertEqual(timer.metaObject().superClass().className(),
"QObject")
+ # PYSIDE-1827, slots with non-QObject object types should work
+ # (metatypes are registered)
+ def test_ObjectSlotSignal(self):
+ app = QCoreApplication()
+ sender = SemaphoreSender()
+ receiver = SemaphoreReceiver()
+ sender.signal.connect(receiver.receiverSlot, Qt.QueuedConnection)
+ sender.emitSignal()
+ while not receiver.semaphore:
+ QCoreApplication.processEvents()
+ self.assertEqual(sender.semaphore, receiver.semaphore)
+
if __name__ == '__main__':
unittest.main()
diff --git a/sources/shiboken6/generator/shiboken/cppgenerator.cpp b/sources/shiboken6/generator/shiboken/cppgenerator.cpp
index 31aa665ae..6e19359eb 100644
--- a/sources/shiboken6/generator/shiboken/cppgenerator.cpp
+++ b/sources/shiboken6/generator/shiboken/cppgenerator.cpp
@@ -5805,10 +5805,14 @@ void CppGenerator::writeInitQtMetaTypeFunctionBody(TextStream &s, const Generato
else
className = context.preciseType().cppSignature();
+ // Register meta types for signal/slot connections to work
if (!metaClass->isNamespace() && !metaClass->isAbstract()) {
// Qt metatypes are registered only on their first use, so we do this now.
bool canBeValue = false;
- if (!metaClass->isObjectType()) {
+ if (metaClass->isObjectType()) {
+ if (!metaClass->isQObject())
+ s << "qRegisterMetaType< ::" << className << " *>();\n";
+ } else {
// check if there's a empty ctor
for (const auto &func : metaClass->functions()) {
if (func->isConstructor() && !func->arguments().count()) {