我有一个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()

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top