删除QTreeView中包含子项的行

时间:2013-06-09 03:09:10

标签: qt qtreeview

我想删除一个包含QTreeView子项的行。我使用QAbstractItemModel的{​​{1}}方法,传递已删除行的行和父索引。但是这个方法返回false。

如何删除包含子项的行?我是否需要编写一个方法来递归删除行?

2 个答案:

答案 0 :(得分:0)

你应该看看这个:removeRow

  

这是一个调用removeRows()的便捷函数。 removeRows()的QAbstractItemModel实现不执行任何操作

QAbstractItemModel::removeRows()

  

基类实现什么都不做,返回false。

     

如果您实现自己的模型,如果要支持删除,可以重新实现此功能。或者,您可以提供自己的API来更改数据。

答案 1 :(得分:0)

我知道我参加派对有点晚了,但我想记录下来,因为我似乎找不到原始问题的任何好答案。

  1. 您需要在模型中实施QAbstractItemModel::removeRows。有一个Qt示例,可编辑树模型,它显示了应该如何完成。基本程序是拨打beginRemoveRows,删除项目,然后拨打endRemoveRows
  2. 您的树项目类应该有一个删除其子项目范围的方法。您可以在removeRows的重新实现中对父项调用此方法。树项目类应设置为在销毁子项时删除它们。 Qt示例通过析构函数执行此操作,但使用C ++ 11及更高版本最好将子项存储在智能指针容器中,以便在容器超出范围时自动删除它们。
  3. 需要考虑在树状视图中折叠或展开的子项目 - QTreeView知道子项目是否可见,并相应地更新视图。换句话说,如果删除具有在树视图中可见的少数子项的树项,它们将自动从视图中删除。这是我在任何地方都找不到的东西,但从个人经验来看,我可以说它有效(只要你正确地呼叫beginRemoveRowsendRemoveRows)。