Qt 如何替换QabstracteModel中的行?

Qt 如何替换QabstracteModel中的行?,qt,model-view,Qt,Model View,在QabstracteModel中,一些函数(如beginInsertRows、beginRemoveRows)可用于插入和删除行。但是如何实现将一行项目替换为另一行项目?如果我理解正确,您需要将指定模型索引的数据更改(一行替换为新的,对于视图,这意味着数据已更改)通知子订阅视图: // let's the row is index that we want to invalidate QVector<int> roles; roles << Qt::DisplayRol

在QabstracteModel中,一些函数(如beginInsertRows、beginRemoveRows)可用于插入和删除行。但是如何实现将一行项目替换为另一行项目?

如果我理解正确,您需要将指定模型索引的数据更改(一行替换为新的,对于视图,这意味着数据已更改)通知子订阅视图:

// let's the row is index that we want to invalidate
QVector<int> roles;
roles << Qt::DisplayRole;
emit dataChanged(index(row, 0), index(row, columnCount()-1), roles);
//让我们来看看这一行是要使其无效的索引
QVector角色;

角色如果要更改大量数据,应执行以下操作:

beginResetModel();
// change data
endResetModel();

如果只更改一行,则发出dataChanged()就可以了。

似乎替换只是先删除,然后插入。这种方法可行,但我认为应该有更好的方法。此外,删除+插入肯定会丢失我尝试过的选择和扩展状态(对于树),但有时它不起作用。当前我发出
layoutChanged()
信号。它可以工作,但我想知道这是否昂贵。我有一个父节点。我将其更改为另一个具有不同子节点的父节点。然后发出
dataChanged
信号,第一个索引作为父级,最后一个索引作为父级的最后一个子级。我还尝试将第一个和最后一个索引设置为与父索引相同。两者都不起作用。谢谢。克里斯的建议可以解决你的问题,视图必须知道你改变了树结构。