質問

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()を使用することもできます

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top