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]
残念ながら、ウィジェットはまだ画面に表示されています!私はチェックしましたが、レイアウトに1回だけ(実際には1つのコピーのみが表示されます)、レイアウトで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 ++オブジェクトのDestructorを呼び出します。 removeWidget
このデストラクタを呼び出すことはありません(まだ 親がいます その時点で)そして del
マークするだけです Python ごみ収集用のオブジェクト。
あなたは同じことを実現することができます(おそらくクリーン):
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 [purchas.id] .deletelater()を使用することもできます
所属していません StackOverflow