[PySide] Signals and recursion

Safa Alfulaij safa1996alfulaij at gmail.com
Tue Sep 1 10:51:30 CEST 2020


Hello world

I have an object with a notifiable property "value".
I also have 1000+ instances, each has the previous object's property signal
connected to it's slot.

In my testing, I exceed the recursion depth at around object 200.
It seems that each "emit" pauses the execution, goes to the receiver to
emit, and so on, which creates new stack frames.

Any way to "solve" this? Thanks!

Ps. I'm not subscribed. Please CC me.

Snippet:

from PySide2.QtCore import *
from PySide2.QtGui import *

class TestObject(QObject):
    valueChanged = Signal('QVariant')

    def __init__(self, *value, name):
        super(TestObject, self).__init__()
        self._value = value
        self._name = name

    @Property('QVariant', notify = valueChanged)
    def value(self):
        return self._value

    @value.setter
    def set_value(self, value):
        if self._value == value:
            return

        self._value = value
        print(f'Emitting {self._name}')
        self.valueChanged.emit(value) # Recursion here
        print(f'Stopping {self._name}')

    @Slot('QVariant')
    def update_value(self, value):
        self.set_value(value)

    def set_dependency(self, test_object):
        test_object.valueChanged.connect(self.update_value)


# create linked objects (obj1-> obj2-> obj3-> obj4-> ... -> obj1999
test_objects = []
for x in range(2000):
    test_objects.append(
        TestObject(x, name=f'test{x}')
    )
    if x != 0:
        test_objects[-1].set_dependency(test_objects[-2])

# update first object, emitting signal to next object, and next, and next,
...
test_objects[0].value = 100
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.qt-project.org/pipermail/pyside/attachments/20200901/1889c5e2/attachment.html>


More information about the PySide mailing list