QTreeView扩展选择和删除/移动多个项目

时间:2014-10-27 07:33:08

标签: qt model-view-controller qtreeview model-view

是否允许在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吗?

1 个答案:

答案 0 :(得分:3)

QAbstractItemModel的每个实现都尽力(至少必须)在模型更改时保持QPersistentModelIndex有效。如果模型无法计算索引的新位置,则会使QPersistentModelIndex无效。删除索引或更改模型布局或整个数据时可能会发生这种情况。

这就是为什么在使用之前检查QPersistentModelIndex是否有效是必要的。

QAbstractItemModel::removeRows会返回bool。这意味着可以将错误的参数传递给此方法。如果模型由于错误的参数而无法删除行,则返回false

因此,您的问题的答案是,您应该检查removeRows中的索引并返回正确的结果。