在创建项目模型时(例如通过子类化QAbstractItemModel
),是否打算嵌套诸如行插入和删除之类的基本操作?
例如,在实践中,必须立即调用::beginInsertRows()
,再调用::endInsertRows()
吗?还是相反,是否允许使用不同的参数调用::beginInsertRows()
两次,然后进行插入,然后调用相应的::endInsertRows()
两次?
我想知道,因为当我阅读QAbstractItemModel
源observed时,该操作是在堆栈基础上完成的。注意 d->changes.push...
另一方面,除了d->changes
等函数对外,beginInsert/endInsert...
不在其他任何地方使用。
最佳答案
就我而言,我将插入分解开来,这样我就可以对父项先执行beginInsertRows
/插入/ endInsertRows
序列,然后对子项进行beginInsertRows
/ insert / endInsertRows
序列。
起初看起来似乎很好,但是当我将自己的自定义模型与QSortFilterProxyModel
一起使用时,我遇到了一些非常奇怪的错误。在修复了模型中的微小不一致并变得越来越好(或变得更加理智)后,花费了好几个小时之后,我陷入了最后一个奇怪的行为,但对寻找错误的想法却一无所获。
然后我想我会尝试另一种方法:一个beginInsertRows
,插入 parent 和子女,然后再一个endInsertRows
。令我惊讶的是,它运行得很好。最后,我可以将此血腥模型从任务列表中剔除。
@vahancho,对不起我的先前评论。由于我的不耐烦,我精疲力尽,试图让我的自定义模型运行起来并误解了您的问题。您的评论实际上包含正确的答案。