Russian Qt Forum
Март 29, 2024, 11:43 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: Перехват update  (Прочитано 18270 раз)
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3257


Просмотр профиля
« Ответ #15 : Апрель 11, 2018, 14:50 »

Ну а по сабжу - update() не вызывает перерисовку, а кладёт запрос на неё в очередь, т.е. paintEvent() и update() - вещи разные.
Можно попробовать отловить, откуда идёт paintEvent()
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #16 : Апрель 12, 2018, 18:09 »

Вам не пришлось бы мутить с отложенными событиями, которые куда-то там "прорываются".
Если я хочу (а я хочу) отложить обновление модели (а не вью) - все то же самое. В 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. А данный код понадеялся на это и тоже запрос не послал. И шо делать?
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3257


Просмотр профиля
« Ответ #17 : Апрель 12, 2018, 18:15 »

Цитировать
// сюда заходит, но updateTime == UpdateLater

Ну это значит, что регион уже был добавлен ранее, что не говорит как бы ниачом.
Я так понимаю, что оно просто копит dirty регионы и когда updatesEnabled отпускается, вызывает update()/paintEvent()
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #18 : Апрель 12, 2018, 18:25 »

Я так понимаю, что оно просто копит dirty регионы и когда updatesEnabled отпускается, вызывает update()/paintEvent()
Не совсем. По идее как только появился первый dirty - QEvent::UpdateRequest уже в очередь полетело. А дальше копит до того как будет очищено перерисовкой.
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3257


Просмотр профиля
« Ответ #19 : Апрель 12, 2018, 19:05 »

А если мы выйдем в очередь случайно?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #20 : Апрель 13, 2018, 08:59 »

А если мы выйдем в очередь случайно?
setUpdatesEnabled(false) не позволит рисовать если модель еще не обновленв
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.076 секунд. Запросов: 23.