从QVBoxLayout中删除自定义小部件

时间:2009-12-08 18:46:05

标签: python qt layout pyqt

我有一个带有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(),但无济于事。什么是正确的方法?

2 个答案:

答案 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()