我有一个包含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
如何避免空单元格?
答案 0 :(得分:1)
删除小部件后,QGridLayout
和QFormLayout
类不会删除其行。空行不占用任何垂直空间,但如果添加小部件而未指定行和列,则它们将放在最后一个空列的旁边。在这些布局中,无法将行数和/或列数重置为零。
在您的示例中,最后一行在第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