Вызывает ли утечка памяти использование функции лямбда-слота в сигнале - PullRequest
0 голосов
/ 20 марта 2020

Я использовал функцию лямбда-слота в сигнале. Лямбда передала дополнительный параметр пациент, пациент - это объект QWidget. Это приведет к утечке памяти? Причиной, по которой я задал этот вопрос, было предложение, которое я увидел в этой статье: не используйте лямбда-функцию в качестве слота. Это невозможно отключить. Адрес статьи: http://enki-editor.org /2014/08/23/Pyqt_mem_mgmt.html, я так понимаю. Лямбда-функция, которая не может быть отключена, никогда не освобождает объект пациента и вызывает утечку памяти.

patient.close_btn.clicked.connect(lambda: self.delete(patient))

1 Ответ

3 голосов
/ 20 марта 2020

Статья, на которую вы ссылаетесь, очень старая и, похоже, ссылается на Qt4. Используя Qt5 / PyQt5, вы можете сохранить экземпляр соединения ...

conn = patient.close_btn.clicked.connect(lambda: self.delete(patient))

и использовать его позже для отключения от сигнала ...

patient.close_btn.clicked.disconnect(conn)

Редактировать 1: Если бы еще раз взглянуть на это, оказалось, что, по крайней мере, с PyQt5, вы можете отключить лямбду без сохранения возвращенного экземпляра соединения, если вы храните саму лямбду как переменную. Так что подключайтесь с ...

l = lambda: self.delete(patient)
patient.close_btn.clicked.connect(l)

и отключайтесь с ...

patient.close_btn.clicked.disconnect(l)

Но следующее не работает ...

patient.close_btn.clicked.connect(lambda: self.delete(patient))
patient.close_btn.clicked.disconnect(lambda: self.delete(patient))

Так как две лямбды, хотя и функционально идентичны, на самом деле относятся к разным переменным. Обратите внимание, что это с Qt5 / PyQt5. Не уверен, верно ли то же самое для Qt4 / PyQt.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...