Details
-
Bug
-
Status: Closed
-
P1: Critical
-
Resolution: Duplicate
-
5.6.0, 5.7.0
-
None
Description
Logic error
void QQmlDelegateModel::_q_itemsChanged(int index, int count, const QVector<int> &roles) { Q_D(QQmlDelegateModel); if (count <= 0 || !d->m_complete) return; if (d->m_adaptorModel.notify(d->m_cache, index, count, roles)) --| | | | bool VDMModelDelegateDataType::notify( <-------------------------| const QQmlAdaptorModel &, /*------------------------------------------- * "d->m_cache by refercence" *------------------------------------------*/ const QList<QQmlDelegateModelItem *> &items, int index, int count, const QVector<int> &roles) const { //..... /*------------------------------------------- * "c - calculated once at the start" *------------------------------------------*/ for (int i = 0, c = items.count(); i < c; ++i) { /*-------------------------------------------------------- * "i - maybe invalid if items.count() changed" * " (items is reference to d->m_cache)" *------------------------------------------------------*/ QQmlDelegateModelItem *item = items.at(i); ------------- -----| const int idx = item->modelIndex(); | if (idx >= index && idx < index + count) { | for (int i = 0; i < signalIndexes.count(); ++i) | /*----------------------------------------------------- | * "Maybe modify d->m_cache.count()" | * "e.g. collapse/expand item(geometry changed), scroll" | *----------------------------------------------------*/ | QMetaObject::activate(item, signalIndexes.at(i), 0); <--| } } }
Call stack:
/*---------------------------------------------------------------------------- * "d->m_cache changed:" * "Crash on the next iteration of the loop: VDMModelDelegateDataType::notify" *---------------------------------------------------------------------------*/ 1 QQmlDelegateModelPrivate::removeCacheItem 2 QQmlDelegateModelItem::Dispose 3 QQmlDelegateModelPrivate::release 4 QQmlDelegateModel::release 5 QQuickItemViewPrivate::releaseItem /*---------------------------------------------------------------------------- * "CacheBuffer changed" *---------------------------------------------------------------------------*/ 8 QQuickListViewPrivate::removeNonVisibleItems 9 QQuickItemViewPrivate::refill 10 QQuickItemViewPrivate::refill 11 QQuickItemViewPrivate::refillOrLayout 12 QQuickListView::viewportMoved 13 QQuickFlickablePrivate::itemGeometryChanged 14 QQuickItemViewPrivate::itemGeometryChanged 15 QQuickListViewPrivate::itemGeometryChanged 16 QQuickItem::geometryChanged 17 QQuickItem::setY 18 QQuickFlickablePrivate::setViewportY 19 QQuickTimeLineValueProxy<QQuickFlickablePrivate>::setValue 20 QQuickFlickable::setContentY 21 QQuickListViewPrivate::setPosition 26 QQuickItem::setHeight 30 QQmlPropertyPrivate::write 31 QQmlPropertyPrivate::writeValueProperty 33 QQmlPropertyPrivate::write 34 QSmoothedAnimation::updateCurrentTime 35 QAbstractAnimationJob::setCurrentTime 36 QAbstractAnimationJob::setState 37 QAbstractAnimationJob::start 38 QSmoothedAnimation::restart 39 QQuickListViewPrivate::updateHighlight 40 QQuickItemViewPrivate::itemGeometryChanged 41 QQuickListViewPrivate::itemGeometryChanged 42 QQuickItem::geometryChanged /*---------------------------------------------------------------------------- * "Item geometry changed" *---------------------------------------------------------------------------*/ 43 QQuickItem::setHeight 48 QQmlVMEMetaObject::metaCall 49 QMetaObject::metacall 50 QQmlBinding::write 51 QQmlBinding::update 52 QQmlBinding::expressionChanged 70 QMetaObject::activate /*---------------------------------------------------------------------------- * "Update cache items (d->m_cahce)" *---------------------------------------------------------------------------*/ 72 VDMModelDelegateDataType::notify 73 QQmlAdaptorModel::notify 74 QQmlDelegateModel::_q_itemsChanged 75 QQmlDelegateModel::_q_dataChanged /*--------------------------------------------------------------------------- * "Model dataChanged : Expand item" *---------------------------------------------------------------------------*/ 81 QAbstractItemModel::dataChanged