2010-06-19 14 views
4

J'ai un QVBoxLayout que j'ai ajouté quelques widgets à, via addWidget(). Je dois maintenant supprimer ces widgets, et il me semble que je dois utiliser removeWidget() (qui prend en compte un widget à supprimer) pour le faire.Obtenir les widgets d'une mise en page dans PyQT

Je pensais que l'appel children() ou findChildren(QWidget) sur ma mise en page retournerait une liste des widgets que j'ai ajouté; Je suis dans le débogueur, cependant, et je reçois juste des listes vides.

Suis-je terriblement malentendu quelque chose? Je viens de commencer à faire PyQT la semaine dernière et j'ai surtout appris par essais et erreurs avec les docs de l'API.

Répondre

9

C'est bizarre. Ma compréhension est que l'ajout de widgets via addWidget transfère la propriété à la mise en page de sorte que l'appel children() devrait fonctionner.

Cependant, comme alternative, vous pouvez boucle sur les éléments de mise en page en utilisant count() et itemAt(int) pour fournir un QLayoutItem à removeItem(QLayoutItem*).

Edit:

J'ai juste essayé addWidget avec une application de test C++ droite. et il ne transfère pas QObject propriété à la mise en page donc children() est en effet une liste vide. Le docs dire clairement que la propriété est transférée si ...

Edit 2:

D'accord, il semble que si elle transfère la propriété du widget qui a cette mise en page (qui est pas ce que les docs m'a dit). Cela fait que les éléments dans les frères et sœurs de la disposition de la mise en page elle-même dans la hiérarchie QObject! Il est donc plus facile de coller avec count et itemAt.

+0

Cela semble faire l'affaire, merci. Cela ne fonctionne pas comme je le voudrais, mais cela semble être dû à des problèmes de mise à jour de l'affichage que je dois résoudre, qui sont assez indépendants de cela. –

+1

Oh, donc 'itemAt' donne un QWidgetItem (qui nécessite l'utilisation de' removeItem', qui, pour une raison quelconque, ne faisait pas ce que je voulais). Si vous appelez '.widget()' dessus, cependant, vous aurez (choc!) Le QWidget qui lui est associé, qui peut être supprimé avec 'removeWidget' et configuré pour avoir un parent de' None'. –

4

Pour obtenir un widget à partir d'un QLayout, vous devez appeler sa méthode itemAt(index). Comme l'indique le nom de cette méthode, il retournera un élément à la place d'un widget. L'appel widget() sur le résultat va enfin vous donner le widget:

myWidget = self.myLayout.itemAt(index).widget() 

Pour supprimer un widget, définissez le widget parent à None:

myWidget.setParent(None) 

vraiment serviable aussi est la méthode QLayout count(). Pour trouver et supprimer tous les contenus d'une mise en page:

index = myLayout.count() 
while(index >= 0): 
    myWidget = myLayout.itemAt(index).widget() 
    myWidget.setParent(None) 
    index -=1