pyqt:删除所有项目并添加新项目时正确更新QGridLayout

时间:2017-09-11 17:01:58

标签: python pyqt pyqt5 qgridlayout

我有一个包含3列的QGridLayout,就像这样创建

self.my_grid = QGridLayout()
self.my_grid.setColumnStretch(2, 0)

用10个物品填充网格后, 看起来像预期的那样:

X X X
X X X
X X X
X

在某些事件中,网格项目会发生变化,我会尝试删除所有项目并添加新项目:

def updateGrid(self, taskList):

    # delete existing items from grid
    for i in reversed(range(self.my_grid.count())):
        widgetToRemove = self.my_grid.itemAt(i).widget()
        widgetToRemove.setParent(None)
        widgetToRemove.deleteLater()

    # add new buttons
    for task in tasklist:
        btn = QPushButton(task)
        self.my_grid.addWidget(btn)

但是它显示了一个像这样的空单元格:

  X X
X X X
X X X
X X

再次调用updateGrid之后,它有两个空单元格,如下所示:

    X
X X X
X X X
X X X

最后,在再次强制再次更新后,我得到了我的预期:

X X X
X X X
X X X
X

如何避免空单元格?

1 个答案:

答案 0 :(得分:1)

删除小部件后,QGridLayoutQFormLayout类不会删除其行。空行不占用任何垂直空间,但如果添加小部件而未指定行和列,则它们将放在最后一个空列的旁边。在这些布局中,无法将行数和/或列数重置为零。

在您的示例中,最后一行在第0列中有一个项目。因此,在下一次迭代中,第一个小部件将添加到第一列。然后在下一次迭代中,最后一行将有两个项目,因此第一个小部件将放在第二列 - 依此类推,直到你回到你开始的位置。

要解决此问题,您可以重复使用现有的空行和列,并更新网格,如下所示:

def updateGrid(self, taskList):
    for i in reversed(range(self.my_grid.count())):
        widgetToRemove = self.my_grid.itemAt(i).widget()
        widgetToRemove.setParent(None)
        widgetToRemove.deleteLater()
    try:
        index = 0
        for row in range(self.my_grid.rowCount()):
            for column in range(self.my_grid.columnCount()):
                btn = QPushButton(taskList[index])
                self.my_grid.addWidget(btn, row, column)
                index += 1
    except IndexError:
        pass