[Development] updating many QPersistentModelIndices

Olivier Goffart olivier at woboq.com
Wed Jun 3 23:14:50 CEST 2015


On Wednesday 3. June 2015 18:56:05 Milian Wolff wrote:
>  void QAbstractItemModelPrivate::Persistent::insertMultiAtEnd(const
> QModelIndex& key, QPersistentModelIndexData *data)
>  {
> +    Q_ASSERT(indexes.count(key) < 2);
>      QHash<QModelIndex,QPersistentModelIndexData *>::iterator newIt =
> -            indexes.insertMulti(key, data);
> +            indexes.insert(key, data);
> +    return;
>      QHash<QModelIndex,QPersistentModelIndexData *>::iterator it = newIt +
> 1; while (it != indexes.end() && it.key() == key) {
>          qSwap(*newIt,*it);

This will of course never assert since you removed the insertMulti.
Try with Q_ASSERT(indexes.count(key) == 0);

> with a developer build, and assertions enabled, everything still works as
> expected (just much faster). I ran the following unit tests, all still pass,
> or behave just as without this patch:
> 
> qabstractitemmodel
> qabstractproxymodel
> qsortfilterproxymodel
> qtreeview
> qlistview
> 
> My own test app also works without asserting. So again - why the multiHash -
> obsolete? If so, I'll push the required changes to Qt 4 and Qt 5 to remove
> QAbstractItemModelPrivate::Persistent::insertMultiAtEnd.

This is really weird, I was pretty sure there is a test that should fail.

Something like: //pseudocode
changePersistentIndex(QModelIndex(3,0), QModelIndex(2,0));
changePersistentIndex(QModelIndex(2,0), QModelIndex(1,0));

Then you get a problem.

-- 
Olivier 

Woboq - Qt services and support - http://woboq.com - http://code.woboq.org





More information about the Development mailing list