2011-06-20 24 views
9

Me gustaría crear un widget que tenga un widget secundario que pueda cambiar dinámicamente. Esto es lo que he intentado:¿Cómo cambiar dinámicamente los widgets secundarios con Python y 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_() 

El problema es que esto no quita realmente la etiqueta "foo" visualmente. Todavía se representa en la parte superior de "barra". Screenshot of the problem. ¿Cómo elimino el viejo widget para que solo se muestre el nuevo widget?

Sé que puedo cambiar la propiedad del texto de la etiqueta. Esto no es lo que quiero en mi aplicación, necesito cambiar el widget real (a un tipo de widget diferente).

Respuesta

18

removeWidget() solo elimina el elemento del diseño, no lo elimina. Puede eliminar el widget hijo llamando al 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

¡Muchas gracias! Eso funciona :) ¿Debo eliminar el widget del diseño? No eliminarlo parece funcionar, pero tal vez esto tenga problemas. – Jules

+6

Buscando un poco en el depurador, parece que la recolección de basura es lo suficientemente inteligente como para eliminar la referencia en el diseño. Entonces, no creo que pueda causar un problema. –

Cuestiones relacionadas