2011-06-20 15 views
9

Chciałbym utworzyć widget, który ma widżet podrzędny, który mogę dynamicznie zmieniać. Oto, co próbowałem:Jak dynamicznie zmieniać widżety potomne za pomocą Pythona i Qt?

import sys 
from PySide.QtCore import * 
from PySide.QtGui import * 

class Widget(QWidget): 
    def __init__(self, parent=None): 
     QWidget.__init__(self, parent) 
     self.setLayout(QVBoxLayout()) 
     self.child = QLabel("foo", self) 
     self.layout().addWidget(self.child) 
    def update(self): 
     self.layout().removeWidget(self.child) 
     self.child = QLabel("bar", self) 
     self.layout().addWidget(self.child) 

app = QApplication(sys.argv) 
widget = Widget() 
widget.show() 
widget.update() 
app.exec_() 

Problem polega na tym, że nie usuwa to wizualnie etykiety "foo". Nadal jest renderowany na "pasku". Screenshot of the problem. Jak usunąć stary widżet, aby wyświetlał się tylko nowy widżet?

Wiem, że mogę zmienić właściwość tekstową etykiety. To nie jest to, czego chcę w mojej aplikacji, muszę zmienić rzeczywisty widget (na inny typ widżetu).

Odpowiedz

18

removeWidget() usuwa tylko element z układu, ale go nie usuwa. Możesz usunąć widget podrzędny, dzwoniąc pod numer setParent(None).

def update(self): 
    self.layout().removeWidget(self.child) 
    self.child.setParent(None) 
    self.child = QLabel("bar", self) 
    self.layout().addWidget(self.child) 
+1

Wielkie dzięki! To działa :) Czy muszę usunąć widget z układu? Nie usunięcie go wydaje się działać, ale może to ma problemy? – Jules

+6

Wciskając trochę w debugerze, wygląda na to, że odśmiecanie jest wystarczająco inteligentne, aby usunąć odniesienie w układzie. Więc nie sądzę, żeby to spowodowało problem. –

Powiązane problemy