【问题标题】:QTreeView extended selection and removal/moving multiple itemsQTreeView 扩展选择和删除/移动多个项目
【发布时间】:2014-10-27 07:33:07
【问题描述】:

是否允许为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;
    }
}

我认为,有可能出现这样的情况,即在子级之前删除父级,甚至持久索引在那一刻都无效。我错了吗?

必须在removeRows 中检查hasIndex 的模型吗?

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 所以,我可能会或可能不会添加persistentIndex.isValid() 检查来决定我是否可以拨打treeModelTranfsormations-&gt;removeRow(persistentIndex.row(), persistentIndex.parent())?
    • 一般不需要这个检查,因为如果索引失效了,那么row返回-1,parent返回一个无效索引。因此, removeRows 内部的检查就足够了。当然,如果你愿意,你可以调用它。它也会起作用。
    猜你喜欢
    • 1970-01-01
    • 2018-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-23
    • 2021-11-13
    相关资源
    最近更新 更多