是否允许在QTreeView
下执行以下删除算法,其中QTreeView::setSelectionMode(QAbstractItemView::ExtendedSelection);
,即可选择多个项目?
QModelIndexList indexList = treeView->selectionModel()->selectedRows();
QList< QPersistentModelIndex > persistentIndexList;
for (QModelIndex const & index : indexList) {
persistentIndexList.append(index);
}
for (QPersistentModelIndex const & persistentIndex : persistentIndexList) {
if (!treeModel->removeRow(persistentIndex.row(), persistentIndex.parent())) {
qWarning() << "Can't remove row" << persistentIndex;
}
}
我认为,有可能出现这种情况,即在子节点之前删除父节点,甚至持久性索引在那一刻都无效。我错了吗?
模型必须在hasIndex
中检查removeRows
吗?
答案 0 :(得分:3)
QAbstractItemModel
的每个实现都尽力(至少必须)在模型更改时保持QPersistentModelIndex
有效。如果模型无法计算索引的新位置,则会使QPersistentModelIndex
无效。删除索引或更改模型布局或整个数据时可能会发生这种情况。
这就是为什么在使用之前检查QPersistentModelIndex
是否有效是必要的。
但QAbstractItemModel::removeRows
会返回bool
。这意味着可以将错误的参数传递给此方法。如果模型由于错误的参数而无法删除行,则返回false
。
因此,您的问题的答案是是,您应该检查removeRows
中的索引并返回正确的结果。