Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: Fregloin от Март 12, 2015, 18:54



Название: Вызов нескольких QGraphicsItem::update()
Отправлено: Fregloin от Март 12, 2015, 18:54
Привет. Вот такой вопрос. Если вызвать несколько раз update() для элемента, paint() вызовется столько же раз, или оно как то кеширует эти вызовы и само рисует в произвольный момент времени?


Название: Re: Вызов нескольких QGraphicsItem::update()
Отправлено: GreatSnake от Март 12, 2015, 18:57
или оно как то кеширует эти вызовы и само рисует в произвольный момент времени?
именно


Название: Re: Вызов нескольких QGraphicsItem::update()
Отправлено: Fregloin от Март 13, 2015, 10:28
еще вопрос.

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


Название: Re: Вызов нескольких QGraphicsItem::update()
Отправлено: deMax от Март 23, 2015, 11:27
Сообщения закидывает в очередь, они обрабатываются последовательно, как очередь придет так и нарисует, по очереди.

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


Название: Re: Вызов нескольких QGraphicsItem::update()
Отправлено: GreatSnake от Март 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();


Название: Re: Вызов нескольких QGraphicsItem::update()
Отправлено: Igors от Март 23, 2015, 12:27
Если есть желание - давайте копнем глубже. С "update" все ясно, классическое поведение с начала 90-x

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

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