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.