2009-12-08 76 views
1

我有一個QFBox和QVBoxLayout,我將自己的自定義小部件添加到佈局 以模擬QListWidget,但在項目中具有更多信息/功能。我的小工具添加到佈局,並保持在一個成員變量的引用(這是蟒蛇):從QVBoxLayout中刪除自定義小部件

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(),但無濟於事。什麼是正確的方法來做到這一點?

回答

6

你可以這樣做:

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不會導致此析構函數被調用(它仍然爲has a parent),並且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] 
+0

這確實如果我使用工作而不是讓它被垃圾收集。爲什麼不從佈局中將其從屏幕上移除? – 2009-12-08 19:07:08

+0

我已經用解釋和另一種實現方法更新了答案。 – ChristopheD 2009-12-08 19:25:11

+0

優秀的,我從來不會想到我自己,謝謝。 – 2009-12-08 19:49:36

1

您還可以使用self.sv_widgets [purchase.id] .deleteLater()