我有一个带有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(),但无济于事。什么是正确的方法?
答案 0 :(得分:6)
你可以这样做:
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)
explicitely 在相应的C ++对象上调用析构函数。 removeWidget
不会导致调用此析构函数(此时它仍为has a parent)并且del
仅标记 Python 对象以进行垃圾回收。
你可以通过做(相当清洁)来实现同样的目标:
self.vl_seatView.removeWidget(self.sv_widgets[purchase.id])
self.sv_widgets[purchase.id].setParent(None)
del self.sv_widgets[purchase.id]
答案 1 :(得分:1)
你也可以使用self.sv_widgets [purchase.id] .deleteLater()