le remplacement de la disposition sur un QWidget avec un autre modèle
J'ai un widget qui change lorsque l'option est activée. Cela annule toutes les dispositions et les widgets. Je garde la liste de toutes les dispositions, afin que je puisse les supprimer à l'aide de quelque chose de semblable à cette réponse:
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.
Comment puis-je me débarrasser de l'ancien réseau et de l'ensemble de la nouvelle?
La documentation est assez laconique et apparemment pas directement applicable à python:
QWidget.setLayout (auto, QLayout)
La QLayout argument a est la propriété transférée à Qt.
Définit le layout manager pour ce widget à disposition.
Si il y a déjà un layout manager installé sur ce widget, QWidget
ne vous permettront pas d'en installer un autre. Vous devez d'abord supprimer l'existant
layout manager (retourné par la mise en page()) avant d'appeler setLayout()
avec la nouvelle mise en page.Si la mise en page est à la disposition de la crèche sur un autre widget, setLayout() va
reparent la mise en page et d'en faire le layout manager pour ce widget.Exemple:
QVBoxLayout *layout = new QVBoxLayout; layout->addWidget(formWidget); setLayout(layout);
Une alternative à l'appel de cette fonction est de passer ce widget à l'
mise en page du constructeur.Le QWidget va prendre possession de mise en page.
Voir aussi layout() et la Mise en page de Gestion.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez simplement reparent la disposition temporaire de widget:
Qui reparent tous les widgets enfants à cet objet temporaire, et que l'objet est supprimé immédiatement avec ses nouveaux enfants, parce que nous n'avons pas de conserver une référence à elle.
Mais la manière typique de plusieurs mises en page pour un seul widget et pour être en mesure de basculer entre eux est d'utiliser un
QStackedWidget
ouQStackedLayout
.Et si vous avez encore besoin de la réponse à cette question secondaire:
Il semble que vous ne pouvez pas supprimer directement un
QObject
qui a un parent, parce que le parent est de garder une référence à cet objet. Mais vous pouvez ajouter l'objet temporaireQObjectCleanupHandler
qui, à l'instar de la solution ci-dessus, sera supprimé avec l'objet(s) qu'elle contient immédiatement:QObjectCleanupHandler()
solution pour supprimer la mise en page.