Files
XiaoYouChRandKay Hayen 6a6e8d9251 Plugins: Fix, the PySide6 signal workaround kept receivers alive (#4109)
* Plugins: Fix, the PySide6 signal workaround for methods kept the objects alive for no
   reason, the corruption issue affects only the function object of the method, not the
   method or the instance itself.

* Added a test that demostrates the objects connected still get released.

---------

Co-authored-by: Kay Hayen <kay.hayen@gmail.com>
2026-10-21 12:28:43 +02:00

82 lines
2.3 KiB
Python

# Copyright 2026, Kay Hayen, mailto:kay.hayen@gmail.com find license text at end of file
"""This test is using signals and will only work if PySide properly accepts
compiled functions as callables, and it checks that their receivers are
released.
"""
# nuitka-project: --mode=standalone
# nuitka-project: --enable-plugin=pyside6
# nuitka-project: --no-debug-immortal-assumptions
# nuitka-skip-unless-imports: PySide6.QtCore
from __future__ import print_function
from PySide6.QtCore import QMetaObject, QObject, Signal, Slot
class Communicate(QObject):
speak = Signal(int)
def __init__(self, name="", parent=None):
QObject.__init__(self, parent)
self.setObjectName(name)
class Speaker(QObject):
@Slot(int)
def on_communicator_speak(self, stuff):
print(stuff)
class Sender(QObject):
fired = Signal()
class Receiver(object):
def __del__(self):
print("Receiver destroyed")
def onFired(self):
print("Receiver called")
speaker = Speaker()
someone = Communicate(name="communicator", parent=speaker)
QMetaObject.connectSlotsByName(speaker)
print("The answer is:", end="")
# emit 'speak' signal
someone.speak.emit(42)
print("Slot should have made output by now.")
sender = Sender()
# Released receivers are disconnected, and each of these disconnects releases
# the method function once, so it has to survive many of them.
for _ in range(10):
sender.fired.connect(Receiver().onFired)
sender.fired.emit()
Receiver().onFired()
# Python test originally created or extracted from other peoples work. The
# parts from me are licensed as below. It is at least Free Software where
# it's copied from other people. In these cases, that will normally be
# indicated.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.