pyqt:删除所有项目并添加新项目时正确更新 QGridLayout
pyqt: update QGridLayout correctly when deleting all items and adding new
我有一个包含 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
如何避免空单元格?
QGridLayout
和 QFormLayout
类 在删除小部件时不会删除它们的行。空行不占用任何垂直 space,但如果您在未指定行和列的情况下添加小部件,它们将被放置在最后一个空列的旁边。在这些布局中无法将行数 and/or 列重置为零。
在您的示例中,最后一行在第零列中有一个项目。因此在下一次迭代中,第一个小部件将添加到第一列。然后在下一次迭代中,最后一行将有两个项目,因此第一个小部件将放置在第二列 - 依此类推,直到您回到开始的位置。
要解决此问题,您可以重新使用现有的空行和列,并像这样更新网格:
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
我有一个包含 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
如何避免空单元格?
QGridLayout
和 QFormLayout
类 在删除小部件时不会删除它们的行。空行不占用任何垂直 space,但如果您在未指定行和列的情况下添加小部件,它们将被放置在最后一个空列的旁边。在这些布局中无法将行数 and/or 列重置为零。
在您的示例中,最后一行在第零列中有一个项目。因此在下一次迭代中,第一个小部件将添加到第一列。然后在下一次迭代中,最后一行将有两个项目,因此第一个小部件将放置在第二列 - 依此类推,直到您回到开始的位置。
要解决此问题,您可以重新使用现有的空行和列,并像这样更新网格:
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