当我点击“删除”按钮时,我希望从表格中删除选定的行。但是,在Qt文档中没有关于删除行的内容。有什么想法吗?
bool QAbstractItemModel::removeRow(int row, const QModelIndex & parent = QModelIndex())
来实现此功能。任务的第二部分是将按钮的单击信号连接到执行删除操作的槽上。removeRows()
用于从所有类型的模型中删除包含它们的数据项的行。 实现必须在插入任何基础数据结构的新列之前先调用beginRemoveRows(),然后立即调用endRemoveRows()。
如果你需要删除多行,使用removeRow()
方法可能会遇到一些问题。这个方法是基于行索引进行操作的,因此在删除行时需要从底部向上删除,以防止删除后行索引发生变化。以下是我在PyQt中实现的方式,虽然不了解C++,但我想它们应该非常相似:
rows = set()
for index in self.table.selectedIndexes():
rows.add(index.row())
for row in sorted(rows, reverse=True):
self.table.removeRow(row)
对我来说运作得非常完美!但需要注意的是,在我的情况下,当用户点击特定单元格(其中有一个带有“X”的按钮)时,此函数将被调用。不幸的是,当他们点击该按钮时,它会取消选择该行,从而防止其被删除。为了解决这个问题,我只需捕获发送者的行,并将其附加到“remove_list”开头,即在“for循环”之前。代码如下:
rows.add(self.table.indexAt(self.sender().pos()).row())
sorted
函数的参数是 reverse
而不是 reversed
。其次,你可以调用 self.table.removeRow
而不是 self.table.model().removeRow
,它只需要传入你想要删除的行索引。第三,使用集合推导式可以缩短行的集合。 - cbrnrremoveRow
方法的建议。我没有测试过这个方法,所以我相信您的话。最后,虽然推导式很高级,但它们并不适合用于说明代码示例 - 我更喜欢写出完整的循环以进行说明。 - Spencer您可以通过从数据库中删除行,然后清除模型并重新填充来使用另一种方法,当您需要删除多行时,这种解决方案也是安全的。