如何替换QAbstractItemModel中的一行?

问题描述:

在QAbstractItemModel中,可以使用某些函数(如beginInsertRows,beginRemoveRows)来插入和删除行。但是如何实现用另一个替换一个行项目呢?如何替换QAbstractItemModel中的一行?

+1

看起来像一个替换只是一个删除,然后插入。 – Chris 2013-03-22 05:39:15

+0

这种方式可行,但我认为应该有更好的方法。 – user1899020 2013-03-22 05:57:32

+2

另外,删除+插入肯定会失去选择和扩展状态(对于一棵树) – barjak 2013-09-25 09:24:13

如果我理解你的权利,你需要通知订阅频道意见有关数据变化(1行更换新的,用于视图这意味着数据已经改变)指定的模型索引:

// 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); 
+0

我试过了,但有时它不能正常工作。目前我发出'layoutChanged()'信号。它的工作原理,但我想知道这是否昂贵。 – user1899020 2013-03-22 14:57:32

+0

你能解释一下哪些工作不正确吗? – AnatolyS 2013-03-22 17:49:56

+0

我有一个父节点。我将其更改为具有不同子级的另一个父节点。然后发出'dataChanged'信号,其中第一个索引作为父索引,最后一个索引作为父索引的最后一个子索引。我也尝试设置与父项相同的第一个和最后一个索引。两者都不起作用。谢谢。 – user1899020 2013-03-22 18:01:24

如果你想改变大量的数据,你应该做这样的事情:

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

如果你改变只有一行,发射dataChanged()应该做的伎俩。