diff options
author | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2022-02-21 13:56:10 +0100 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2022-02-28 20:38:30 +0000 |
commit | 49bc88f6e4012f33514cc9b2d3305358a4320c2d (patch) | |
tree | 6f0a89cf7875f80970e76e95cf9ea73499cc00f7 | |
parent | ab7e0fea1e64f4c56073a798bab2068eb6b04722 (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.py | 37 | ||||
-rw-r--r-- | sources/shiboken6/generator/shiboken/cppgenerator.cpp | 6 |
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()) { |