void QGraphicsScenePrivate::_q_processDirtyItems() { processDirtyItemsEmitted = false; if (updateAll) { Q_ASSERT(calledEmitUpdated); // <<< *** ASSERTION FAILURE *** // No need for further processing (except resetting the dirty states). // The growingItemsBoundingRect is updated in _q_emitUpdated. for (int i = 0; i < topLevelItems.size(); ++i) resetDirtyItem(topLevelItems.at(i), /*recursive=*/true); return; } const bool wasPendingSceneUpdate = calledEmitUpdated; const QRectF oldGrowingItemsBoundingRect = growingItemsBoundingRect; // Process items recursively. for (int i = 0; i < topLevelItems.size(); ++i) processDirtyItemsRecursive(topLevelItems.at(i)); dirtyGrowingItemsBoundingRect = false; if (!hasSceneRect && oldGrowingItemsBoundingRect != growingItemsBoundingRect) emit q_func()->sceneRectChanged(growingItemsBoundingRect); if (wasPendingSceneUpdate) return; for (int i = 0; i < views.size(); ++i) views.at(i)->d_func()->processPendingUpdates(); if (calledEmitUpdated) { // We did a compatibility QGraphicsScene::update in processDirtyItemsRecursive // and we cannot wait for the control to reach the eventloop before the // changed signal is emitted, so we emit it now. _q_emitUpdated(); } // Immediately dispatch all pending update requests on the views. for (int i = 0; i < views.size(); ++i) views.at(i)->d_func()->dispatchPendingUpdateRequests(); }