substituindo layout em um QWidget com outro layout

Eu tenho um widget que muda quando uma opção é alternada. Isso invalida todos os layouts e widgets. Eu mantenho uma lista de todos os layouts, então eu posso deletá-los usando algo semelhante aesta resposta:

<code>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.
</code>

Como posso me livrar do layout antigo e definir o novo?

A documentação ébastante conciso e aparentemente não diretamente aplicável ao python:

QWidget.setLayout (self, QLayout)

O argumento QLayout tem sua propriedade transferida para o Qt.

Define o gerenciador de layout para este widget para layout.

Se já houver um gerenciador de layout instalado neste widget, o QWidget não permitirá a instalação de outro. Você deve primeiro excluir o gerenciador de layout existente (retornado pelo layout ()) antes de chamar setLayout () com o novo layout.

Se layout for o gerenciador de layout em um widget diferente, setLayout () reparará o layout e fará dele o gerenciador de layout para esse widget.

Exemplo:

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

Uma alternativa para chamar essa função é passar esse widget para o construtor do layout.

O QWidget assumirá a propriedade do layout.

Veja também layout () e Layout Management.

questionAnswers(1)

yourAnswerToTheQuestion