Skip to main content
 首页 » 编程设计

python之从 QVBoxLayout 中删除自定义小部件

2025年05月04日16wayfarer

我有一个带有 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]