Как стать автором
Обновить

Комментарии 4

Полезная статья. Странно, что об этом до сих пор никто не писал.

Когда только начинал работать с PyQt/PySide, а приложения становились всё больше, то постоянно ловил крэши при выходе из приложения из-за описанных в данной статье проблем с корректным удалением объектов и последовательности их удаления. Особенно замучило то, что сигналы, подключенные к lambda-функциям, почему-то корректно не отключались в PySide. В итоге решил для себя вообще отказаться от использования lambda-функций в качестве слотов.
Буквально на днях сталкивался с подобным в PyQt.

Была локальная функция, которая вешалась на сигнал из треда для обновления списка в диалоговом окне. Первый же запуск вызвал «изумление» — данные скачиваются, а после закрытия диалога программа молча и без диагностики падает. Всё честно — поюзали диалог и он удалился, а сигналы не отключились ))
1) Многие из таких болячек предотвращаются на ура, если об этом просто помнить всегда.
Кстати, спасибо за статью — наверняка спасет многих от долгих поисков «решения».

2) Взято из PyQt / QObject:
When an object is deleted, it emits a destroyed() signal. You can catch this signal to avoid dangling references to QObjects.
Если все же словил подобное и развести не удается, то что-нибудь вроде этого иногда помогает (иногда в процессе поиска, иногда как решение — например сделать свой isAlive):
obj.destroyed[QObject].connect(self.destroyed_slot)

3) Некоторые из таких ошибок можно предотвратить повесив на closeEvent окна или aboutToQuit приложения небольшой цикл ожидания (например ждать максимум 1000ms пока очередь, c qt reference в питоне будет пуста и т.д.).
Кстати о бабочках, может кто-нибудь знает какую-нибудь стандартную ку-питонью обертку или може какой «велосипед» над QPointer::isNull. Имо, иногда очень бы помогало при решении подобных проблем.
Зарегистрируйтесь на Хабре , чтобы оставить комментарий

Публикации

Истории