QGridLayout 不会返回其所有子小部件

Posted

技术标签:

【中文标题】QGridLayout 不会返回其所有子小部件【英文标题】:QGridLayout does not return all of its child widgets 【发布时间】:2012-07-13 07:54:45 【问题描述】:

我有一个QGridLayout,需要删除它的所有按钮,然后重新创建它们。 我尝试使用count() 循环布局,然后使用takeAt() 删除返回的LayoutItem 的小部件。然而,出于某种原因,我只得到了一半的小部件:其他 LayoutItems 没有小部件。这很奇怪,我可以看到它们。

这是我目前的简化代码。

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

【问题讨论】:

【参考方案1】:

尝试使用

self.grid.takeAt( 0 ) 

代替:

self.grid.takeAt(i)

在您的代码中,您在第一次迭代中采用At(0)。这在内部使旧的#1 成为新的#0,旧的#2 成为新的#1,依此类推。

然后在您的下一次迭代中,您采用At(1),这实际上是旧的#2。这样旧的#1(现在是#0)就不会被删除。

【讨论】:

以上是关于QGridLayout 不会返回其所有子小部件的主要内容,如果未能解决你的问题,请参考以下文章

将组件添加到子小部件后调整 QDialog 的大小

Pyqt QMdiSubWindow 使用可变数量的小部件调整大小

【PyQt】网格布局 QGridLayout

遍历框架中的所有子小部件并检查小部件的类型

Gtk3用另一个小部件替换子小部件

具有重叠子小部件的 Qt 自定义小部件