Вам не пришлось бы мутить с отложенными событиями, которые куда-то там "прорываются".
Если я хочу (а я хочу) отложить обновление 
модели (а не вью) - все то же самое. В Qt есть нечто подобное (метод IsChanging, в букварь не вошел), но используется только для пресечения сортировки. 
Ну а по сабжу - update() не вызывает перерисовку, а кладёт запрос на неё в очередь, т.е. paintEvent() и update() - вещи разные.
Предлагаю считать собеседников достаточно грамотными  

Можно попробовать отловить, откуда идёт paintEvent()
Из QEvent::UpdateRequest которое засылается тем самым update(). Перед вызовом paint вью апдейтит айтемы опираясь, однако, на модель - она должна быть валидна. 
Место где пропускается засылка UpdateRequest я конечно давно нашел 
C++ (Qt)
void QWidgetBackingStore::markDirty(const QRect &rect, QWidget *widget,
                                    UpdateTime updateTime, BufferState bufferState)
....
   const QRect translatedRect(widgetRect.translated(widget->mapTo(tlw, QPoint())));
    if (qt_region_strictContains(dirty, translatedRect)) {
        if (updateTime == UpdateNow)                  // сюда заходит, но updateTime == UpdateLater
            sendUpdateRequest(tlw, updateTime);   // не выполняется
        return; // Already dirty
    }
 
Вероятно буги-вуги. Кто-то маркировал dirty но UpdateRequest или не был послан или не имел эффекта, т.к. setUpdatesEnabled стояло в false. А данный код понадеялся на это и тоже запрос не послал. И шо делать?