从QVBoxLayout中移除自定义部件

1 投票
2 回答
1018 浏览
提问于 2025-04-15 16:48

我有一个QFrame,里面放了一个QVBoxLayout(垂直布局),我在这个布局里添加了自己做的自定义控件,目的是模拟一个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 个回答

1

你也可以用 self.sv_widgets[purchase.id].deleteLater() 这个方法来删除某个东西。

7

你可以这样做:

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并不会触发这个析构函数的调用(在那时,它仍然有一个父对象),而del只是把这个Python对象标记为可以被垃圾回收了。

你可以通过以下方式实现相同的效果(可能更简洁):

self.vl_seatView.removeWidget(self.sv_widgets[purchase.id])
self.sv_widgets[purchase.id].setParent(None)
del self.sv_widgets[purchase.id]

撰写回答