Qt在QTableView中删除选定行

11
当我点击“删除”按钮时,我希望从表格中删除选定的行。但是,在Qt文档中没有关于删除行的内容。有什么想法吗?

请查看 removeRow(s) 函数... - leemes
3个回答

15
您可以使用bool QAbstractItemModel::removeRow(int row, const QModelIndex & parent = QModelIndex())来实现此功能。
在这里,您可以找到有关所有这些内容的示例
此外,以下是来自该文档的内联引用:

removeRows()

用于从所有类型的模型中删除包含它们的数据项的行。 实现必须在插入任何基础数据结构的新列之前先调用beginRemoveRows(),然后立即调用endRemoveRows()。

任务的第二部分是将按钮的单击信号连接到执行删除操作的槽上。

6

如果你需要删除多行,使用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())

你把 QTableView(问题)和 QTableWidget(答案)混淆了。QTableView 没有 selectedRanges() 方法,而且添加/删除/更新必须在模型层面处理,而不是在视图层面处理(QTableWidget 有自己的嵌入式模型由视图管理)。 - mins
@mins 您说得对!这段代码有些无效,但是在处理模型时概念基本相同。我会更新我的答案,包括一个直接处理模型的示例。对于 QTableView 来说,这实际上非常简单。 - Spencer
首先,sorted 函数的参数是 reverse 而不是 reversed。其次,你可以调用 self.table.removeRow 而不是 self.table.model().removeRow,它只需要传入你想要删除的行索引。第三,使用集合推导式可以缩短行的集合。 - cbrnr
@cbmr 感谢您指出那些错误,也欢迎您在未来进行编辑。我已经修复了排序参数,并采纳了您关于调用视图的removeRow方法的建议。我没有测试过这个方法,所以我相信您的话。最后,虽然推导式很高级,但它们并不适合用于说明代码示例 - 我更喜欢写出完整的循环以进行说明。 - Spencer

0

您可以通过从数据库中删除行,然后清除模型并重新填充来使用另一种方法,当您需要删除多行时,这种解决方案也是安全的。


13
我认为最好避免这种思维方式。 - g24l
1
这不是违背了整个MVC的概念吗?View的酷之处在于它们如何“动态”地链接到数据库,而强制清除并重新填充只会打败整个目的。 - Spencer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接