2009-12-08 4 views
1

У меня QFrame с QVBoxLayout, и я добавляю свои собственные виджеты в макет для имитации QListWidget, но с дополнительной информацией/функциональностью в элементах. Добавить виджет на макете и сохранить ссылку в переменной члена (это Python):Удаление пользовательского виджета из 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

Это действительно работает, если я использую это вместо того, чтобы просто позволить ему собирать мусор. Почему не просто удалить его из макета, удалите его с экрана? –

+0

Я обновил ответ с объяснением и другим способом добиться того же. – ChristopheD

+0

Отлично, я никогда бы не подумал об этом, спасибо. –

1

Вы также можете использовать self.sv_widgets [purchase.id] .deleteLater()

Смежные вопросы