문제

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()를 사용할 수도 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top