Визуализация QGraphicsScene в соответствии с уровнем масштабирования

Есть ли (быстрый?) Способ визуализации только подмножества элементов GraphicsScene в соответствии с уровнем масштабирования View? У меня большая сцена с множеством линий сетки, и я хочу скрыть / показать некоторые из них, когда масштаб изменяется, чтобы избежать эффекта "сетка полностью заполняет сцену".

Линии сетки отрисовываются с использованием метода addLine GraphicsScene.

PS Может быть, самый простой способ - нарисовать сетку где-нибудь еще (на вид или что-то в этом роде), потому что по логике они не являются частью моей сцены, они всего лишь ориентиры? Но я не знаю, какой путь более эффективен.

3 ответа

Решение

Не рекомендуется создавать такую ​​сетку, потому что вы будете создавать много объектов, которые будут влиять на дерево BSP сцен, поэтому оно будет работать медленно. Это также затруднит использование LOD-масштабирования, как вы описали.

Я бы переписал QGraphicsView::drawBackground(QPainter* painter, const QRectF& rect)и используйте границы представления в координатах сцены, чтобы вычислить, сколько линий сетки вы хотите и где они находятся. Затем просто покрасьте как обычная операция покраски.

Вам нужно будет установить режим обновления QGraphicsView::FullViewportUpdate в противном случае вы получите артефакты в сетке рендера.

Для линий сетки я считаю, что наиболее распространенный подход состоит в том, чтобы нарисовать их в QGraphicsScene::drawBackground() метод. Так что вам придется создать подкласс QGraphicsScene и переопределить этот метод. Это то, что я делаю в одном из моих приложений, и оно работает очень хорошо.

У меня также есть некоторые переменные zoomX а также zoomY в моем подклассе QGraphicsScene. Я устанавливаю их всякий раз, когда изменяется масштаб представления. Тогда по моему drawBackground() Метод я проверяю, подходит ли масштаб, и если да, я рисую линии, в противном случае я не делаю.

Вам определенно нужно будет создать подкласс стандартных подклассов QGraphicsItem (и, следовательно, отказаться от удобства addLine()).

в paint() метод подкласса QGraphicsLineItem, вы можете попытаться перевести координаты линии в систему координат представления (используя преобразование в QPainter экземпляр дан paint()). Затем вы можете оценить физическую длину линии (физическую как в: длина в пикселях на виде) и прервать рисование, если линии слишком короткие.

Имейте в виду, что выполнение такого большого количества координатных вычислений, вероятно, сделает все очень медленно.

Изменить: лучший способ может быть реализовать совершенно новый QGraphicsItem, который рисует сетку сразу. Это экономит некоторые накладные расходы на уровне QGraphicsScene по сравнению с поддержкой сотен позиций.

Другие вопросы по тегам