ersetzt das Layout eines QWidgets durch ein anderes Layout

8

Ich habe ein Widget, das sich ändert, wenn eine Option umgeschaltet wird. Dies macht alle Layouts und Widgets ungültig. Ich behalte die Liste aller Layouts, damit ich sie löschen kann, indem ich etwas ähnlich wie diese Antwort verwende:

%Vor%

Wie kann ich das alte Layout loswerden und das neue setzen?

Die Dokumentation ist ziemlich knapp und anscheinend nicht direkt anwendbar auf Python:

  

QWidget.setLayout (selbst, QLayout)

     

Das QLayout Argument hat seinen Besitz auf Qt übertragen.

     

Setzt den Layout-Manager für dieses Widget auf Layout.

     

Wenn bereits ein Layout-Manager auf diesem Widget installiert ist, QWidget   lässt dich nicht ein anderes installieren. Sie müssen zuerst das vorhandene löschen   Layout-Manager (zurückgegeben von layout ()), bevor Sie setLayout () aufrufen können   mit dem neuen Layout.

     

Wenn Layout der Layout-Manager eines anderen Widgets ist, wird setLayout () dies tun   repariere das Layout und mache es zum Layout-Manager für dieses Widget.

     

Beispiel:

%Vor%      

Eine Alternative zum Aufruf dieser Funktion besteht darin, dieses Widget an die   Layoutkonstruktor.

     

Das QWidget übernimmt das Layout.

     

Siehe auch Layout () und Layoutverwaltung.

    
eudoxos 02.05.2012, 15:13
quelle

1 Antwort

19

Sie können das Layout einfach an ein temporäres Widget reparieren:

%Vor%

Dadurch werden alle untergeordneten Widgets an dieses temporäre Objekt neu gerendert, und dieses Objekt wird sofort zusammen mit seinen neuen untergeordneten Elementen gelöscht, weil wir keinen Verweis darauf beibehalten.

Aber die typische Möglichkeit, mehrere Layouts für ein einzelnes Widget zu haben und zwischen ihnen wechseln zu können, ist die Verwendung von QStackedWidget oder QStackedLayout .

Und wenn Sie noch die Antwort auf diese sekundäre Frage brauchen:
  

Wie lösche ich zuerst das alte Layout?

Es scheint, dass Sie nicht direkt ein QObject löschen können, das einen Elternteil hat, weil der Elternteil einen Verweis auf das Objekt behält. Sie können das Objekt jedoch zu einem temporären QObjectCleanupHandler hinzufügen, das wie die obige Lösung sofort mit den darin enthaltenen Objekten gelöscht wird:

%Vor%     
alexisdm 03.05.2012, 20:56
quelle

Tags und Links