2

我有一个 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

如何避免空单元格?

4

1 回答 1

4

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

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

要解决此问题,您可以重新使用现有的空行和列,并像这样更新网格:

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
于 2017-09-11T19:49:34.433 回答