Визуализация 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 по сравнению с поддержкой сотен позиций.