在创建项目模型时(例如通过子类化QAbstractItemModel),是否打算嵌套诸如行插入和删除之类的基本操作?

例如,在实践中,必须立即调用::beginInsertRows(),再调用::endInsertRows()吗?还是相反,是否允许使用不同的参数调用::beginInsertRows()两次,然后进行插入,然后调用相应的::endInsertRows()两次?

我想知道,因为当我阅读QAbstractItemModelobserved时,该操作是在堆栈基础上完成的。注意 d->changes.push... 另一方面,除了d->changes等函数对外,beginInsert/endInsert...不在其他任何地方使用。

最佳答案

就我而言,我将插入分解开来,这样我就可以对父项先执行beginInsertRows /插入/ endInsertRows序列,然后对子项进行beginInsertRows / insert / endInsertRows序列。

起初看起来似乎很好,但是当我将自己的自定义模型与QSortFilterProxyModel一起使用时,我遇到了一些非常奇怪的错误。在修复了模型中的微小不一致并变得越来越好(或变得更加理智)后,花费了好几个小时之后,我陷入了最后一个奇怪的行为,但对寻找错误的想法却一无所获。

然后我想我会尝试另一种方法:一个beginInsertRows,插入 parent 和子女,然后再一个endInsertRows。令我惊讶的是,它运行得很好。最后,我可以将此血腥模型从任务列表中剔除。

@vahancho,对不起我的先前评论。由于我的不耐烦,我精疲力尽,试图让我的自定义模型运行起来并误解了您的问题。您的评论实际上包含正确的答案。

07-26 05:14