@ Бальфа верна. Простой ответ заключается в том, что если вы не передадите родительский элемент или иным образом не убедитесь, что экземпляр filter
имеет оперативную ссылку, он будет собирать мусор.
PyQt использует SIP для привязки к реализации Qt C ++. Из SIP документации :
Когда экземпляр C ++ упакован, создается соответствующий объект Python. Объект Python ведет себя так, как и следовало ожидать в отношении сборки мусора - это сборка мусора, когда его счетчик ссылок достигает нуля. Что же происходит с соответствующим экземпляром C ++? Очевидный ответ может состоять в том, что вызывается деструктор экземпляра. Однако API библиотеки может сказать, что когда экземпляр передается определенной функции, библиотека становится владельцем экземпляра, то есть ответственность за вызов деструктора экземпляра переносится из сгенерированного модуля SIP в библиотеку.
Право собственности на экземпляр также может быть связано с другим экземпляром. Подразумевается, что собственный экземпляр будет автоматически уничтожен, если уничтожен экземпляр-владелец. SIP отслеживает эти отношения, чтобы гарантировать, что циклический сборщик мусора в Python может обнаруживать и прерывать любые ссылочные циклы между владельцем и экземплярами, которыми он владеет. Ассоциация реализована как экземпляр-владелец, принимающий ссылку на принадлежащий экземпляр.
Вышеприведенное подразумевает, что если вы передадите объект Python объекту Qt, который становится владельцем, все также будет работать, даже если вы не гарантировали, что ссылка на конкретный объект была сохранена.
Итак, чтобы повторить то, что @balpha сказал в своем комментарии, вот один обходной путь для случая, когда вы не хотите передавать объект конструктору:
self.filter = delkeyFilter()
self.dataTreeView.installEventFilter(self.filter)