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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QT 4.3.3 Как заставить QGraphicsScene апдейтить только часть себя?  (Прочитано 5667 раз)
mal
Гость
« : Февраль 21, 2008, 21:12 »

Ситуация следущая - на сцену добавлен QGraphicsGroupItem, в нем туча объктов наследников QGraphicsPolygonItem. На MouseClick добавляю QGraphicsLineItem и при mouseMove меняю ему координаты от точки нажатия до текущей позиции. Если мыша не забегает на объекты группы сцена апдейтится быстро и линия перерисоовывается также. Как только мыша залазит на объекты груп-айтема - включаются страшные тормоза. Дебаг показал, что сцена перерисовывает все объекты группы на каждый чих. Причем большая часть этих объектов может находится за пределами видимой части окна (изображение увеличено).
Вопрос: как заставить сцену апдейтить только кусок себя, например находящийся под boundingRect lineItem'а ? Или сделать так чтоб она не перерисовывала  все item'ы из группы?
Пробовал следующее:
по левому клику говорю вью (QGraphicsVew) со сценой не апдейтить себя -
view->setViewportUpdateMode( QGraphicsView::NoViewportUpdate);
, а при движении мыши принудительно апдейтить кусок сцены под айтемом с линией - view->invalidateScene( lineItem.boundingRect());
Однако при таких действиях перерисовки сцены не происходит (по выходу из режима, въюдпортапдейт устанавливаю обратно в QGraphicsView::MinimalViewportUpdate)Подмигивающий.


Вариант, который сразу отметается:
1. Прорисовать все полигоны в pixmapItem->плюнуть его на сцену. В этом случае все конечно клево и быстро, но при масштабировании будет происходить масштабирование этого пиксмапа вместе со сценой и линии (сплайны в моем случае) выглядят при этом некрасиво.


ЗЫ Пока писал вопрос пришла мысль не совать все полигоны в группу, а накидать их прямиком на сцену - возможно в этом случае будут апдейтится только "поврежденные" полигоны.

Тем не менее вопрос актуален - как заставить сцену апдейтить только часть себя? Видимую часть себя? 
Есть мысли?
Записан
mal
Гость
« Ответ #1 : Февраль 26, 2008, 10:54 »

Еще детализирую:
(исключить объекты из группы и кинуть их прямо на сцену  - никакого выигрыша не дало, оно и понятно - группа не есть отдельный графический элемент, а всего лишь контейнер ).

Попытаюсь конкретизировать задачу - представим что мы рисуем раскидистый куст. Мои полигоны - это ветки этого куста. способ построения полигонов таков, что кривая ветка может проходить через всю сцену.
Далее: плотность веток куста велика. Каждая ветка в моем случае - это отдельный QGraphicsPolygonItem.
При добавлении новой ветки, происходит перекрытие какой либо ветки куста (или же n-веток). Bounding rect этой ветки может закрывать большую часть сцены, и соответственно перекрывать другие полигоны, вызывая так же их перерисовку.
Таким образом, при отрисовке QGraphicsLineItem от точки нажатия до текущей позиции мыши, происходит каскадная перерисовка сцены  и множества ее элементов. И эта добавляемая ветка рисуется с бо-о-льшими задержками.

Повторяю вопрос - можно ли сцене назначить какой рект ей можно апдейтить?
Иначе  придется возвращаться к проверенным методам отрисовки (например как с использованием битовых матриц под виндой - bitblt  форева!). Но в этом случае весь графический процесс представления данных мне придется взять на себя. И отказаться от использования на первый взгляд такого мощного инструмента как "Сцена-въю". Что не есть ку.
Эксперты - так ку или не ку?
Записан
vaprele07
Гость
« Ответ #2 : Февраль 26, 2008, 13:53 »

У него как и у всех виджетов есть методы update, repaint, где можно задать область прорисовки, только зачем это нужно?
SmartViewportUpdate? обычно группа тормозит только при удалении элемента Улыбающийся
Записан
mal
Гость
« Ответ #3 : Февраль 26, 2008, 19:11 »

вот кое-что нарыл, есть интересные вещи по ускорению графики, в моем случае помогло (использовал оба пути показанные в ссылке)
кому интересно - ройтесь и юзайте
http://thesmithfam.org/blog/2007/02/03/qt-improving-qgraphicsview-performance/
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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