Название: Вызов нескольких 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: Для быстрого обновления видимой части рекомендую использовать Код
Название: Re: Вызов нескольких QGraphicsItem::update() Отправлено: Igors от Март 23, 2015, 12:27 Если есть желание - давайте копнем глубже. С "update" все ясно, классическое поведение с начала 90-x
- update сообщает ОС что окно (или часть его или контрол) нуждается в перерисовке. Когда управление придет к ОС (в цикле событий), он пошлет событие рисования, и тогда уже перерисуется на экране. Поэтому можно хоть 100 раз звать update, это ничем не грозит (вот он, кеш рисования) Однако есть еще QEvent::UpdateRequest который собственно и вызывает paintEvent'ы (причем, насколько я понял, обновляется окно целиком). И вот является ли этот UpdateRequest тем самым ответом на событие рисования (что послал ОС) - не знаю. Во всяком случае на OSX самостоятельный вызов UpdateRequest не обновляет экран. |