2012-07-13 41 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

相關問題