2012-09-18 3 views
2

보기 확대/축소 수준에 따라 GraphicsScene 항목의 하위 집합 만 렌더링하는 빠른 방법이 있습니까? 많은 격자 선이있는 커다란 장면을 가지고 있는데, 확대/축소가 '장면을 완전히 채 웁니다'효과를 피하기 위해 변경하거나 숨기거나 표시하고 싶습니다.확대/축소 수준에 따라 QGraphicsScene 렌더링

그리드 선은 GraphicsScene의 addLine 메소드를 사용하여 그려집니다.

P. 어쩌면, 가장 쉬운 방법은 논리적으로 그들이 내 장면의 일부가 아니기 때문에 다른 곳으로 그리드를 그리는 것입니다 (보기 또는 똑같이). 그러나 어느 방법이 더 효과적인지 모르겠습니다.

답변

1

장면을 BSP 트리에 영향을주는 많은 개체를 만들기 때문에 그리드를 만드는 것이 좋지 않으므로 빠르게 느려질 것입니다. 또한 더 어려운 설명처럼 LOD 줌을 사용하게됩니다.

QGraphicsView::drawBackground(QPainter* painter, const QRectF& rect)을 덮어 쓰고 장면 좌표의보기 경계를 사용하여 원하는 그리드 선 수와 위치를 계산합니다. 그런 다음 일반 그림 작업으로 페인트합니다.

업데이트 모드를 QGraphicsView::FullViewportUpdate으로 설정해야합니다. 그렇지 않으면 그리드 렌더링에 인공물이 생깁니다.

0

당신은 분명히 주식 QGraphicsItem 서브 클래스를 서브 클래스화할 필요가있을 것이고 따라서 편리 성을 포기해야합니다. addLine(). QGraphicsLineItem 서브 클래스의 paint() 방법에서

있습니다 (이 paint()에게 주어진 QPainter 인스턴스에서 변환을 사용) 선이 뷰의 좌표계로 좌표 변환을 시도 할 수 있습니다. 그런 다음 선의 실제 길이를 예측할 수 있습니다 (보기의 픽셀 길이 : 실제 길이). 선이 너무 짧으면 그림을 중단합니다.

너무 많은 좌표 계산을 수행하면 모든 것이 매우 느려질 수 있지만주의해야합니다.

편집 : 더 나은 방법은 그리드를 한 번에 그리는 완전히 새로운 QGraphicsItem을 구현하는 것일 수 있습니다. 이렇게하면 수백 개의 광고 항목을 유지 관리하는 것과 비교하여 QGraphicsScene 수준에서 약간의 오버 헤드가 절약됩니다.

1

그리드 라인의 경우 가장 일반적인 방법은 QGraphicsScene::drawBackground() 방법으로 그리는 것입니다. 따라서 QGraphicsScene을 서브 클래스 화하고이 메소드를 재정의해야합니다. 그게 내가 내 응용 프로그램 중 하나에서하는 일이며 매우 잘 작동합니다.

또한 QGraphicsScene 하위 클래스에 zoomXzoomY이라는 변수가 있습니다. 뷰의 축척이 변경 될 때마다 설정합니다. 그런 다음 내 drawBackground() 메서드에서 확대/축소가 적절한 지 여부를 확인하고, 그렇다면 선을 그립니다. 그렇지 않으면 선을 그립니다.

관련 문제