Supprimer les widgets et la mise en page ainsi
J'ai essayé de trouver quelque chose qui serait de prendre un qt mise en page et de supprimer tout ce. Juste pour l'imaginer à quoi ressemble la fenêtre - j'ai:
QVBoxLayout
| ------QHboxLayout
|---------QWidget
| ------QHboxLayout
|---------QWidget
.........
Donc j'ai besoin de quelque chose que je peux appeler récursivement pour EFFACER ET SUPPRIMER tous les trucs de ma mère QVBoxLayout
. J'ai essayé des choses mentionnées ici ( Effacer tous les widgets dans une mise en page en pyqt ), mais aucun d'eux ne fonctionne (pas de réponse correcte marqué de toute façon). Mon code ressemble à ceci:
def clearLayout(self, layout):
for i in range(layout.count()):
if (type(layout.itemAt(i)) == QtGui.QHBoxLayout):
print "layout " + str(layout.itemAt(i))
self.clearLayout(layout.itemAt(i))
else:
print "widget" + str(layout.itemAt(i))
layout.itemAt(i).widget().close()
Mais il donne une erreur:
layout.itemAt(i).widget().close()
AttributeError: 'NoneType' object has no attribute 'close'
=>MODIFIER
Ce genre de travaux (mais ne fait pas si il y a un autre Layout
que HBoxLayout
:
def clearLayout(self, layout):
layouts = []
for i in range(layout.count()):
if (type(layout.itemAt(i)) == QtGui.QHBoxLayout):
print "layout " + str(layout.itemAt(i))
self.clearLayout(layout.itemAt(i))
layouts.append(layout.itemAt(i))
else:
print "widget" + str(layout.itemAt(i))
if (type(layout.itemAt(i)) == QtGui.QWidgetItem):
layout.itemAt(i).widget().close()
OriginalL'auteur kosta5 | 2012-02-21
Vous devez vous connecter pour publier un commentaire.
Le moyen le plus sûr pour effacer une mise en page consiste à extraire les éléments avec ses takeAt méthode, puis supprimez de façon explicite les widgets avec deleteLater:
OriginalL'auteur ekhumoro
Le problème avec votre code est
QLayout.itemAt()
renvoie uneQLayoutItem
,QWidgetItem
ouQSpacerItem
en fonction de l'élément à cette position. Donc la condition:ne sera jamais
True
et vous sera d'essayer de faire.widget()
pour unQLayoutItem
et qui renvoieNone
. Ainsi, l'erreur que vous obtenez. Une autre chose est, vous avez besoin pour faire une boucle vers l'arrière. Parce que la suppression de choses depuis le début décaler les éléments et modifier l'ordre des éléments.Vous devez écrire votre fonction comme ceci:
Je sorta fixe comme ceci: def clearLayout(auto, la mise en page): for i in range(mise en page.count()): if (type(mise en page.itemAt(i)) == QtGui.QHBoxLayout): print "mise en page" + str(mise en page.itemAt(i)) de soi.clearLayout(mise en page.itemAt(i)) else: print "widget" + str(mise en page.itemAt(i)) if (type(mise en page.itemAt(i)) == QtGui.QWidgetItem): mise en page.itemAt(i).widget().close()
C'est bizarre. Je reçois
QLayoutItem
s pour mes essais. De toute façon, j'ai édité le code. Essayez celui-ci.OriginalL'auteur Avaris