使用循环从PyQt4中的QListView中的QStandartItemModel中删除QStandardItems

时间:2015-11-19 02:48:21

标签: python pyqt qlistview qstandarditemmodel

我有一个QListView显示QStandardItems中包含的多个QStandardItemModel。模型中的项目已启用复选框。我有一个QPushButton连接到以下方法(属于一个继承自QTabWidget的类),点击后:

def remove_checked_files(self):
    rows_to_remove = []  # will contain the row numbers of the rows to be removed.
    for row in range(self.upload_list_model.rowCount()):  # iterate through all rows.
        item = self.upload_list_model.item(row)  # get the item in row.
        if item.checkState() == 2:  # if the item is checked.
            rows_to_remove.append(row)
    for row in rows_to_remove:
        # this loop SHOULD remove all the checked items, but only removes
        # the first checked item in the QListView
        self.upload_list_model.removeRow(row)

所以问题是,正如我在代码注释中所说的那样,只删除了列表中第一个选中的项。我知道最后一个for循环循环的次数与复选框的次数一样多,因此removeRow被称为正确的次数。

如何解决此问题?

编辑:

self.upload_list_model是QStandardItemModel

EDIT2:

我已经意识到问题出在最后一个循环中:它会更改每个循环中的行索引,使rows_to_remove列表对下一次删除无用。所以我错了,当我说循环只从模型中删除一个项目时,它总是试图删除正确数量的项目,但在我的测试中我试图删除第二个和最后一个项目(例如),之后删除第二个项目后,最后一项不再出现在循环尝试删除的行中。

现在我理解了这个问题,但我仍然不知道如何在整个循环中改变行索引。有什么建议吗?

1 个答案:

答案 0 :(得分:2)

我设法用这种递归方法解决了这个问题:

def remove_checked_files(self):

    for row in range(self.upload_list_model.rowCount()):
        item = self.upload_list_model.item(row)  # get the item in row.
        if item and item.checkState() == 2:  # if the item is checked.
            self.upload_list_model.removeRow(row)
            self.remove_checked_files()