gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 22:30:06 26 4
gpt4 key购买 nike

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

如何避免出现空单元格?

最佳答案

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

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

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

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

关于python - pyqt:删除所有项目并添加新项目时正确更新 QGridLayout,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46160858/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com