从QVBoxLayout中移除自定义部件
我有一个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]