1

我想删除一个有子级的行QTreeView。我使用QAbstractItemModel'sremoveRow ( int row, const QModelIndex & parent = QModelIndex() )方法,传递删除行的行和父索引。但是这个方法返回false。

如何删除有孩子的行?我是否需要编写一个递归删除行的方法?

4

2 回答 2

0

你应该看看这个:removeRow

这是一个调用 removeRows() 的便捷函数。removeRows() 的 QAbstractItemModel 实现什么都不做

在这里QAbstractItemModel::removeRows()

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

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

于 2013-07-10T04:22:24.037 回答
0

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

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