QVBoxLayout에서 사용자 정의 위젯 제거
문제
QVBoxLayout과 함께 QFrame을 가지고 있으며 QListWidget을 시뮬레이션하기 위해 자신의 사용자 정의 위젯을 레이아웃에 추가하지만 항목에 더 많은 정보/기능을 제공합니다.레이아웃에 위젯을 추가하고 멤버 변수(Python)에 참조를 유지합니다.
self.sv_widgets[purchase.id] = widget
self.vl_seatView.addWidget(widget)
그런 다음 항목 작업이 끝나면 화면에서 해당 항목을 제거하고 참조를 정리하고 싶습니다.
self.vl_seatView.removeWidget(self.sv_widgets[purchase.id])
del self.sv_widgets[purchase.id]
안타깝게도 위젯이 여전히 화면에 표시되고 있습니다!확인했고 레이아웃에 한 번만 추가하고(실제로는 하나의 복사본만 표시됨) 레이아웃에서 수동으로 update() 호출을 시도했지만 소용이 없었습니다.이를 수행하는 올바른 방법은 무엇입니까?
해결책
다음을 수행할 수 있습니다.
import sip # you'll need this import (no worries, it ships with your pyqt install)
sip.delete(self.sv_widgets[purchase.id])
sip.delete(obj)
명시적으로 해당 C++ 개체에서 소멸자를 호출합니다. removeWidget
이 소멸자가 호출되도록 하지 않습니다(여전히 부모가 있다 그 시점에서) 그리고 del
표시만 한다 파이썬 가비지 수집 대상입니다.
다음을 수행하여 동일한 결과를 얻을 수 있습니다.
self.vl_seatView.removeWidget(self.sv_widgets[purchase.id])
self.sv_widgets[purchase.id].setParent(None)
del self.sv_widgets[purchase.id]
다른 팁
self.sv_widgets[purchase.id].deleteLater()를 사용할 수도 있습니다.
제휴하지 않습니다 StackOverflow