Вы можете создать подкласс list
и использовать для него простой QObject с настраиваемым сигналом, а затем переопределить все методы, которые могут изменить размер списка, чтобы вы могли излучать сигнал для каждого из них.
class ListProxy(QtCore.QObject):
resized = QtCore.pyqtSignal(list)
class SignalList(list):
def __init__(self, *args):
super().__init__(*args)
self._proxy = ListProxy()
self.resized = self._proxy.resized
def append(self, item):
super().append(item)
self.resized.emit(self)
def extend(self, iterable):
super().extend(iterable)
self.resized.emit(self)
def pop(self, *args):
item = super().pop(*args)
self.resized.emit(self)
return item
# this is required for slicing -> myList[:] = []
# you might want to check if the length of the list is actually changed
# before emitting the signal
def __setitem__(self, *args, **kwargs):
super().__setitem__(*args, **kwargs)
self.resized.emit(self)
def __delitem__(self, *args, **kwargs):
super().__delitem__(*args, **kwargs)
self.resized.emit(self)
# this is required for concatenation -> myList += iterable
def __iadd__(self, *args, **kwargs):
super().__iadd__(*args, **kwargs)
self.resized.emit(self)
return self
Обратите внимание, что в вашем примере сигнал не будет испускаться, потому что вы используете метод получения только для получения существующего объекта res
, затем вы вызываете метод добавления для этого списка; сеттер никогда не будет вызываться таким образом.