我有一个带有 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 不会导致调用此析构函数(此时它仍为 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]
