2011-01-07 16 views
10

Tengo un QHBoxLayout con un QTreeWidget a la izquierda, un separador en el medio y un widget a la derecha.¿Cómo reemplazar un widget por otro usando Qt?

Cuando hago clic en el QTreeWidget, quiero cambiar el widget en el derecho a modificar el QTreeWidgetItem

Traté de hacer esto con este código:

def new_rendez_vous(self): 
    self.ui.horizontalLayout_4.removeWidget(self.ui.editionFormWidget) 
    del self.ui.editionFormWidget 
    self.ui.editionFormWidget = RendezVousManagerDialog(self.parent) 
    self.ui.editionFormWidget.show() 
    self.ui.horizontalLayout_4.addWidget(self.ui.editionFormWidget) 
    self.connect(self.ui.editionFormWidget, QtCore.SIGNAL('saved'), self.scheduleTreeWidget.updateData) 

def edit(self, category, rendez_vous): 
    self.ui.horizontalLayout_4.removeWidget(self.ui.editionFormWidget) 
    del self.ui.editionFormWidget 
    self.ui.editionFormWidget = RendezVousManagerDialog(self.parent, category, rendez_vous) 
    self.ui.editionFormWidget.show() 
    self.ui.horizontalLayout_4.addWidget(self.ui.editionFormWidget) 
    self.connect(self.ui.editionFormWidget, QtCore.SIGNAL('saved'), self.scheduleTreeWidget.updateData) 

def edit_category(self, category): 
    self.ui.horizontalLayout_4.removeWidget(self.ui.editionFormWidget) 
    del self.ui.editionFormWidget 
    self.ui.editionFormWidget = CategoryManagerDialog(self.parent, category) 
    self.ui.editionFormWidget.show() 
    self.ui.horizontalLayout_4.addWidget(self.ui.editionFormWidget) 
    self.connect(self.ui.editionFormWidget, QtCore.SIGNAL('saved'), self.scheduleTreeWidget.updateData) 

Pero esto no funciona y todos los widgets están apilados uno encima del otro:

Exemple of the bug http://hubscher.remy.free.fr/tally/images/2011/01/07/CaptureDescribingTheBug525.jpg.

¿Sabes cómo puedo eliminar el viejo widget y luego mostrar el nuevo?

Respuesta

16

La solución más común es usar QStackedWidget y poner todos los widgets posibles en la pila. Al seleccionar un artículo, simplemente llame al setCurrentWidget para mostrar el que desea.

+0

Bien, lo intentaré. Gracias – Natim

16

Tengo la misma pregunta que Natim.

El QStackedWidget es una solución para un diseño preestablecido. Actúa como la cosa flippy en un restaurante viejo para una caja de música. (X-cantidad de álbumes en la máquina de discos, hojear los álbumes instalados).

Sin embargo, esto no resuelve la pregunta.

Por ejemplo, tengo código Estoy creando prototipos con una interfaz de usuario, sin embargo, quiero reemplazar algunos de los widgets que funcionan como marcadores de lugar con los widgets adecuados que están codificados durante la ejecución del script principal o dinámicamente creados .

Estoy seguro de que hay un procedimiento simple o una advertencia sobre cómo quitar/reemplazar un widget correctamente.

El código que tengo tiene un widget textEdit básico en un diseño de cuadrícula. Quiero codificar una versión personalizada de este widget para arrastrar y soltar y luego cambiarla por el texto predeterminado Edit.

Al igual que Natim, el código parece lógicamente correcto, sin embargo, los widgets se apilan de forma desordenada en el diseño como si se tratara de una bolsa.

Afortunadamente, podemos descubrir el truco y volver a publicar la advertencia.

SOLUCIÓN:

Voilà !! Encontré algo que definitivamente hace el truco. CIERRE su widget

# Remove, Create, Replace 
    self.ui.gridLayout.removeWidget(self.ui.dragDataEdit) 
    self.ui.dragDataEdit.close() 
    self.ui.dragDataEdit = myDumpBox(self.ui.centralwidget) 
    self.ui.gridLayout.addWidget(self.ui.dragDataEdit, 0, 0, 1, 1) 
    self.ui.gridLayout.update() 

Quité el widget del diseño, luego cerré el widget. En este momento la variable que estoy usando está abierta para crear mi widget personalizado/modificado, y luego volver a insertarlo en el diseño

Sí, se necesita algo más de elegancia para lidiar con diseños más complicados, pero la necesidad básica de destruir un widget para reemplazarlo está en el método .close()

Saludos ... espero que esto ayude. B

Cuestiones relacionadas