Python pyqt:删除所有项并添加新项时正确更新QGridLayout
我有一个3列的QGridLayout,创建方式如下Python pyqt:删除所有项并添加新项时正确更新QGridLayout,python,pyqt,pyqt5,qgridlayout,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 X X X X X X X X X X X X X X X X X X X X def updateGrid(self, taskList): for i in reversed(range(self.my
self.my_grid = QGridLayout()
self.my_grid.setColumnStretch(2, 0)
用10个项目填充网格后,
正如预期的那样:
X X X
X X X
X X X
X
X X
X X X
X X X
X X
X
X X X
X X X
X X X
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
在某些情况下,网格项会发生更改,我会尝试删除所有项并添加新项:
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
X X
X X X
X X X
X X
X
X X X
X X X
X X X
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
再次调用updateGrid后,它有两个空单元格,如下所示:
X X X
X X X
X X X
X
X X
X X X
X X X
X X
X
X X X
X X X
X X X
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
最后,在再次强制执行一次更新后,我得到了我期望的结果:
X X X
X X X
X X X
X
如何避免空单元格?删除小部件时,
QGridLayout
和QFormLayout
类不会删除它们的行。空行不会占用任何垂直空间,但是如果添加小部件而不指定行和列,它们将被放置在最后一个空列的旁边。在这些布局中,无法将行数和/或列数重置回零
在您的示例中,最后一行的第0列中有一项。因此,在下一次迭代中,第一个小部件将添加到第一列。然后在下一次迭代中,最后一行将有两个项目,因此第一个小部件将被放置在第二列,以此类推,直到回到开始的位置
要解决此问题,可以重复使用现有的空行和空列,并按如下方式更新网格:
X X X
X X X
X X X
X
X X
X X X
X X X
X X
X
X X X
X X X
X X X
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
啊,非常感谢。回答得很好。由于每次重新加载项目时网格中的项目数都会发生变化,因此我无法重用现有的行,但我想我必须替换整个网格。@user3729611。如果行数改变,但列数保持不变,那么我的答案仍然有效。通过一些小的更改,还可以更改列的数量。网格只是在任意一个维度上自动增长。