2012-07-13 71 views
2

我有QGridLayout,需要删除其所有按钮然后重新创建它们。 我试着循环使用count()后跟takeAt()来删除返回的LayoutItem的小部件。但是,由于某种原因,我只能获得一半的小部件:其他LayoutItem s没有小部件。这很奇怪,因为我可以看到它们。QGridLayout不会返回其所有子窗口小部件

这是我目前的简化代码。

import sys 
from PySide.QtGui import * 
from PySide.QtCore import * 

class GridView(QWidget): 

    def __init__(self, parent=None): 
     super(GridView, self).__init__(parent) 
     self.grid = QGridLayout(self) 

    def setButtons(self): 

     self.clearPage() 
     for i in xrange(10): 
      btn = QPushButton(str(i)) 
      self.grid.addWidget(btn, i/2, i % 2) 

    def clearPage(self): 
     for i in xrange(self.grid.count()): 
      print i 
      layoutItem = self.grid.takeAt(i) 
       # the following errors out after the fifth iteration as layoutItem.widget() returns None 
      print layoutItem.widget() 
      layoutItem.widget().deleteLater() 


app = QApplication(sys.argv) 
mainWindow = QWidget() 
layout = QVBoxLayout() 
mainWindow.setLayout(layout) 
btn = QPushButton('test') 
v = GridView() 
btn.clicked.connect(v.setButtons) 

layout.addWidget(v) 
layout.addWidget(btn) 
mainWindow.show() 
sys.exit(app.exec_()) 

回答

3

尝试使用

self.grid.takeAt(0) 

代替:

self.grid.takeAt(i) 

在代码中,你takeAt(0)在第一次迭代。这在内部使旧的#1成为新的#0,旧的#2成为新的#1等等。

然后在你的下一次迭代中,你需要(1),其实是旧的#2。这样老的#1(现在是#0)不会被删除。

+0

啊,当然。感谢那! – 2012-07-14 00:39:43