2012-05-02 16 views
8

Tengo un widget que cambia cuando se alterna una opción. Esto invalida todos los diseños y widgets. Sigo lista de todos los diseños, por lo que puede eliminarlas con algo similar a this answer:reemplazando el diseño en un QWidget con otro diseño

class MyWidget(QFrame): 
    # ... 
    def reLayout(self): 
     def deleteLayoutChilds(l): 
     while l.count(): 
      item=l.takeAt(0) 
      widget=item.widget() 
      if widget: widget.deleteLater() 
      else: deleteLayoutChilds(item.layout()) 
     for l in self.allLayouts: deleteLayoutChilds(l) 

     # now install the new layout 
     ## 
     ## how to delete the old layout first? 
     l=self.layout(); del l # no effect 
     # 
     layout=QGridLayout(self) 
     ## warning: QLayout: Attempting to add QLayout "" to MyWidget "", which already has a layout. 

¿Cómo puedo deshacerme del antiguo trazado y establecer el nuevo?


La documentación es quite terse y al parecer no es directamente aplicable a Python:

QWidget.setLayout (auto, QLayout)

El argumento QLayout tiene su propiedad transferida a Qt.

Establece el administrador de diseño para este widget en el diseño.

Si ya hay un administrador de diseño instalado en este widget, QWidget no le permitirá instalar otro. Primero debe eliminar el administrador de diseño de existente (devuelto por el diseño()) antes de que pueda llamar a setLayout() con el nuevo diseño.

Si el diseño es el administrador de diseño en un widget diferente, setLayout() será reparará el diseño y lo convertirá en el administrador de diseño para este widget.

Ejemplo:

QVBoxLayout *layout = new QVBoxLayout; 
layout->addWidget(formWidget); 
setLayout(layout); 

Una alternativa a llamar a esta función es pasar este widget para el constructor de la disposición .

El QWidget se hará cargo de la distribución.

Consulte también el diseño() y la Gestión de diseños.

Respuesta

19

Usted puede simplemente Reparent el diseño de un widget temporal:

def reLayout(self): 
    QWidget().setLayout(self.layout()) 
    layout = QGridLayout(self) 
    ... 

Eso se Reparent todos los widgets hijos a ese objeto temporal, y ese objeto se elimina inmediatamente junto con sus nuevos niños porque Don Mantenga una referencia a eso.

Pero la forma típica de tener múltiples diseños para un solo widget y poder cambiar entre ellos es usar QStackedWidget o QStackedLayout.


Y si todavía necesita la respuesta a esa pregunta secundaria:

cómo eliminar el antiguo trazado primero?

Parece que no puede eliminar directamente un QObject que tiene un elemento principal, porque el elemento primario mantiene una referencia a ese objeto.Pero se puede agregar el objeto a un temporal QObjectCleanupHandler que, como la solución anterior, se eliminará con el objeto (s) que contiene inmediato:

QObjectCleanupHandler().add(self.layout()) 
+1

+1 para el 'QObjectCleanupHandler()' solución para eliminar el diseño . – astrojuanlu

Cuestiones relacionadas