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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Вызов нескольких QGraphicsItem::update()  (Прочитано 3903 раз)
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« : Март 12, 2015, 18:54 »

Привет. Вот такой вопрос. Если вызвать несколько раз update() для элемента, paint() вызовется столько же раз, или оно как то кеширует эти вызовы и само рисует в произвольный момент времени?
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #1 : Март 12, 2015, 18:57 »

или оно как то кеширует эти вызовы и само рисует в произвольный момент времени?
именно
Записан

Qt 5.11/4.8.7 (X11/Win)
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #2 : Март 13, 2015, 10:28 »

еще вопрос.

есть у элемента несколько методов, таких как setColor, setText, setBackgroundColor и т.п. В некоторых нужно просто сделать апдейт после смены цвета, в других нужно дернуть prepareGeometryChange(), что бы вызвать пересчет внтуренныих координат и сообщить об изменении размеров элемента.
Я сделал методы beginUpdate() и endUpdate(). В beginUpdate ставлю флаг updating:bool = true, и во всех методах установки свойств элемента (цвета, шрифты и т.п.) я update() не вызываю, а вызываю после endUpdate(). Еслть ли в этом смысл или не заморчаичваться и тулить где надо update() а где надо prepareGeometryChange()?
Записан
deMax
Хакер
*****
Offline Offline

Сообщений: 600



Просмотр профиля
« Ответ #3 : Март 23, 2015, 11:27 »

Сообщения закидывает в очередь, они обрабатываются последовательно, как очередь придет так и нарисует, по очереди.

Вы можете сделать blocksignal(true), а в конце отключить. Если не хотите чтобы класс вызывал сигналы, в процессе обновления его содержимого.
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #4 : Март 23, 2015, 11:57 »

Сообщения закидывает в очередь, они обрабатываются последовательно, как очередь придет так и нарисует, по очереди.
Только вот не в случае QWidget::update(). Ибо
Цитата: assistant
This function does not cause an immediate repaint; instead it schedules a paint event for processing when Qt returns to the main event loop. This permits Qt to optimize for more speed and less flicker than a call to repaint() does.
Calling update() several times normally results in just one paintEvent() call.

Цитировать
Вы можете сделать blocksignal(true), а в конце отключить. Если не хотите чтобы класс вызывал сигналы, в процессе обновления его содержимого.
Только вот опять не этом случае, т.к. никакие сигналы не испускаются.
Здесь можно использовать QWidget::updatesEnabled() и то для QGraphicsView::viewport().

2 TC:
Для быстрого обновления видимой части рекомендую использовать
Код
C++ (Qt)
QGraphicsView::viewport()->update();
Записан

Qt 5.11/4.8.7 (X11/Win)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Март 23, 2015, 12:27 »

Если есть желание - давайте копнем глубже. С "update" все ясно, классическое поведение с начала 90-x

- update сообщает ОС что окно (или часть его или контрол) нуждается в перерисовке. Когда управление придет к ОС (в цикле событий), он пошлет событие рисования, и тогда уже перерисуется на экране. Поэтому можно хоть 100 раз звать update, это ничем не грозит (вот он, кеш рисования)

Однако есть еще QEvent::UpdateRequest который собственно и вызывает paintEvent'ы (причем, насколько я понял, обновляется окно целиком). И вот является ли этот UpdateRequest тем самым ответом на событие рисования (что послал ОС) - не знаю. Во всяком случае на OSX самостоятельный вызов UpdateRequest не обновляет экран.

Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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