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