2017-01-20 1 views
2

Le code affiché crée une fenêtre unique avec 5 lignes de widgets. En cliquant sur Push Button déclenche la fonction qui ne parvient pas à effacer la fenêtre de tous les widgets à l'aide de la méthode .takeAt(). Pourquoi?Comment supprimer des widgets

enter image description here

from PyQt4 import QtCore, QtGui 
app = QtGui.QApplication([]) 

view = QtGui.QWidget() 
view.setLayout(QtGui.QVBoxLayout()) 

def btnClicked(): 
    items = [] 
    for i in range(view.layout().count()): 
     item = view.layout().itemAt(i) 
     items.append(item) 

    for num, item in enumerate(items): 
     print 'taking out item:', num, item 
     view.layout().takeAt(num) 


for i in range(5): 
    sublayout = QtGui.QHBoxLayout() 
    view.layout().addLayout(sublayout) 

    sublayout.addWidget(QtGui.QLabel('Label:')) 
    sublayout.addWidget(QtGui.QLineEdit('Text Edit')) 

    btn = QtGui.QPushButton('Push Button') 
    btn.clicked.connect(btnClicked) 
    sublayout.addWidget(btn) 

view.show() 
app.exec_() 

Répondre

1

Tout d'abord, vous ne pouvez pas supprimer en toute sécurité les éléments d'un conteneur tout en itérer dessus. Chaque fois que vous supprimez un élément de la mise en page, les éléments restants descendent tous et leurs index changent en conséquence. Par conséquent, une fois le point intermédiaire atteint, votre compteur de boucles ne se rapportera plus à un élément valide. La bonne façon de supprimer les éléments dans une boucle est comme ceci:

def btnClicked(): 
    layout = view.layout() 
    while layout.count(): 
     item = layout.takeAt(0) 
     print(repr(item)) 

En second lieu, les éléments de mise en page que vous sont en train de supprimer des éléments, des schémas de non widgets. Une fois que toutes les mises en page ont été supprimées, tous les widgets seront laissés là où ils sont. Vous pouvez le voir si vous utilisez la méthode ci-dessus, puis redimensionnez la fenêtre - les widgets ne sont plus gérés par aucune mise en page et ne sont donc pas également redimensionnés.

Lorsque des widgets sont ajoutés à une mise en page, ils sont automatiquement re-parentés au widget propriétaire de la mise en page. Si ce widget parent est supprimé, tous ses enfants seront également récursivement supprimés. Donc, un widget (ou son parent) doit être explicitement supprimé afin d'être complètement supprimé:

def clearLayout(layout): 
    if layout is not None: 
     while layout.count(): 
      item = layout.takeAt(0) 
      widget = item.widget() 
      if widget is not None: 
       widget.deleteLater() 
      else: 
       clearLayout(item.layout()) 

def btnClicked(): 
    clearLayout(view.layout()) 
+0

Merci! Sharp comme toujours! – alphanumeric