2

があり、QGridLayoutすべてのボタンを削除してから再作成する必要があります。返されたウィジェットを削除するために、count()続いてを使用してレイアウトをループしてみました。ただし、何らかの理由で、ウィジェットの半分しか取得できません。他のウィジェットにはウィジェットがありません。私が見ることができるように、これは非常に奇妙です。takeAt()LayoutItemLayoutItem

これが私の現在の簡略化されたコードです。

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_())
4

1 に答える 1

3

使ってみてください

self.grid.takeAt( 0 ) 

それ以外の:

self.grid.takeAt(i)

コードでは、最初の反復でtakeAt(0)を使用します。これにより、内部的に古い#1が新しい#0になり、古い#2が新しい#1になります。

次に、次の反復でtakeAt(1)を実行します。これは、実際には古い#2です。そうすれば、古い#1(現在は#0)は削除されません。

于 2012-07-13T08:03:57.340 に答える