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