Mic*_*iak 5 c++ qt model view qt5
我自己的观点直接基于QAbstractItemView.一般来说,我需要存储有关特定模型项目的一些信息.
所以在我看来,我有一个QModelIndex描述partical项的struct到struct.然后我主要在视图上使用这些数据paintEvent.
问题是,QModelIndex不是持久的,它可能会过时.因此,当从模型中插入或删除行时,某些行QModelIndex可能会变为无效,我不应该对它们进行中继.
那么我怎样才能在模型中的项目和我在视图中使用的一些装饰数据之间建立关系?
QPersistentModelIndex 似乎是适合这类事情的工具,但我知道它的性能(我的模型和视图可能很大).
另一个问题QPersistentModelIndex是它可能不应该用作地图的键(因为它在我的情况下),因为它可能(并且将)改变并使地图不一致.
我已经看了Qt的QTreeView和QListView的实现,看看他们如何处理行删除/插入,但似乎他们只是丢弃所有数据.
所以在这一点上,我看不出任何简单的方法来解决我的问题.
您可以安全地使用a QPersistentModelIndex作为映射或散列键.即使底层QModelIndex变化,"执着"的一部分确保所有QPersistentModelIndex被不断更新,同时保留他们的身份,即operator ==与qHash()返回一致的值.
话虽这么说,您不应该在视图中存储有关索引的数据.数据应该由模型存储.这似乎是它在Qt类中的完成方式:视图正在进行大量调用QAbstractItemModel::data().
我认为值得存储在视图中的唯一数据是"缓存数据",即以下值:
如果不满足这3个条件中的任何一个,我个人的偏好是将数据存储在模型中.