Qt删除QTableView中的选定行

时间:2013-09-25 18:26:20

标签: c++ qt qtableview qabstracttablemodel

当我点击delete按钮时,我想从表格中删除选定的行。

但我找不到有关删除Qt文档中的行的任何内容。有什么想法吗?

Image

3 个答案:

答案 0 :(得分:14)

您可以使用bool QAbstractItemModel::removeRow(int row, const QModelIndex & parent = QModelIndex())功能。

在这里,您可以找到所有这些example

此外,这是该文档的内联引用:

  

removeRows()

     

用于删除行及其包含的数据项   来自各种型号。实现必须调用beginRemoveRows()   在将新列插入任何底层数据结构之前,以及   之后立即调用endRemoveRows()。

任务的第二部分是将按钮的点击信号连接到执行删除的插槽。

答案 1 :(得分:1)

您可以通过删除数据库中的行来使用其他方法,然后清除模型并再次填充它,当您删除多行时,此解决方案也是安全的。

答案 2 :(得分:1)

如果要删除多行,可能会使用removeRow()调用遇到一些并发症。这对行索引进行操作,因此您需要从下往上删除行,以便在删除行索引时保持行索引不变。这就是我在PyQt中做到的,不知道C ++,但我想它非常相似:

rows = set()
for index in self.table.selectedIndexes():
    rows.add(index.row())

for row in sorted(rows, reversed=True):
    self.table.model().removeRow(row, self.table.rootIndex()) # you'll need to provide the parent. In this case I'm giving the example of a table with no sub-children.

完美适合我!然而有一件事要知道,在我的情况下,当用户点击特定单元格(具有带“X”的按钮)时,会调用此函数。不幸的是,当他们点击那个按钮时,它取消选择该行,然后阻止它被删除。为了解决这个问题,我刚刚捕获了发送者的行,并在“for循环”之前将其附加到“remove_list”的最开头。看起来像这样:

remove_list.append(self.table.indexAt(self.sender().pos()).row())