diff options
| author | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2024-03-28 09:32:09 +0100 |
|---|---|---|
| committer | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2024-04-02 07:45:35 +0100 |
| commit | 279658b856c3d7c5ce5cd936af2da018fe33d13a (patch) | |
| tree | 8af14c412d2e65f22f189fbdbad08e19fac46201 /sources/pyside6/tests/signals/lambda_test.py | |
| parent | c174421fabf189aa877deac7d1b8d5503ec54991 (diff) | |
libpyside/Signal manager: Ensure cleanup of main thread targets
Restore a notification on a sender's QObject::destroy() signal for
main thread objects. Instead of triggering instant deletion as was
done before (causing issues with recursion and threads), start an idle
timer to call the Signal manager cleanup.
Amends 1270a9e82e5bc3bd53a1131698ece60403da1192.
Pick-to: 6.7
Task-number: PYSIDE-2646
Task-number: PYSIDE-2141
Change-Id: Ifdc28f729cab64d58ac2ab300daece98b167d915
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: Cristian Maureira-Fredes <cristian.maureira-fredes@qt.io>
Diffstat (limited to 'sources/pyside6/tests/signals/lambda_test.py')
| -rw-r--r-- | sources/pyside6/tests/signals/lambda_test.py | 24 |
1 files changed, 23 insertions, 1 deletions
diff --git a/sources/pyside6/tests/signals/lambda_test.py b/sources/pyside6/tests/signals/lambda_test.py index c3198c305..23fcdf5fa 100644 --- a/sources/pyside6/tests/signals/lambda_test.py +++ b/sources/pyside6/tests/signals/lambda_test.py @@ -7,13 +7,14 @@ import os import sys import unittest +import weakref from pathlib import Path 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 QObject, Signal, SIGNAL, QProcess +from PySide6.QtCore import QCoreApplication, QObject, Signal, SIGNAL, QProcess from helper.usesqapplication import UsesQApplication @@ -96,6 +97,27 @@ class QtSigLambda(UsesQApplication): self.assertTrue(dummy.called) self.assertEqual(dummy.exit_code, proc.exitCode()) + def testRelease(self): + """PYSIDE-2646: Test whether main thread target slot lambda/methods + (and their captured objects) are released by the signal manager + after a while.""" + + def do_connect(sender): + receiver = Receiver() + sender.void_signal.connect(lambda: setattr(receiver, 'called', True)) + return receiver + + sender = Sender() + receiver = weakref.ref(do_connect(sender)) + sender.emit_void() + self.assertTrue(receiver().called) + del sender + for i in range(3): + if not receiver(): + break + QCoreApplication.processEvents() + self.assertFalse(receiver()) + if __name__ == '__main__': unittest.main() |
