题
我有一个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]
不幸的是,仍然被显示在屏幕上的小部件!我检查,我只是将它添加到布局一次(实际上只显示一个副本),手动打过电话的布局更新(),但无济于事。什么是应该做的正确方法?
解决方案
您可以这样做:
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 对象进行垃圾收集。
您可以通过执行(propably清洁器)实现相同的:
self.vl_seatView.removeWidget(self.sv_widgets[purchase.id])
self.sv_widgets[purchase.id].setParent(None)
del self.sv_widgets[purchase.id]
其他提示
您还可以使用self.sv_widgets [purchase.id] .deleteLater()
不隶属于 StackOverflow