从QVBoxLayout中删除自定义小部件

gct*_*gct 1 python layout qt pyqt

我有一个带有QVBoxLayout的QFrame,我将自己的自定义小部件添加到布局中以模拟QListWidget,但项目中包含更多信息/功能.我将小部件添加到布局中并在成员变量中保留引用(这是Python):

 self.sv_widgets[purchase.id] = widget                
 self.vl_seatView.addWidget(widget)
Run Code Online (Sandbox Code Playgroud)

然后当我完成一个项目时,我想从屏幕上删除它并清理引用:

self.vl_seatView.removeWidget(self.sv_widgets[purchase.id])
del self.sv_widgets[purchase.id]
Run Code Online (Sandbox Code Playgroud)

不幸的是,小部件仍然显示在屏幕上!我已经检查过,我只将它添加到布局一次(实际上只显示了一个副本),尝试在布局上手动调用update(),但无济于事.这样做的正确方法是什么?

Chr*_*heD 6

你可以这样做:

import sip # you'll need this import (no worries, it ships with your pyqt install)
sip.delete(self.sv_widgets[purchase.id])
Run Code Online (Sandbox Code Playgroud)

sip.delete(obj) 明确地在相应的C++对象上调用析构函数.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]
Run Code Online (Sandbox Code Playgroud)