2011-11-13 2 views
1

QGraphicsPixmapitem 항목의 사각형으로 작성된지도를 표시하고 있습니다 (각 항목은 하나의지도 타일을 나타냄). 내 맵이 매우 크기 때문에 (PNG 파일 약 30MB) QGraphicsView에서 사용자가 볼 수 있고 보이지 않을 때 언로드 할 때만 픽스맵을 필요할 때로드 할 수 있기를 원합니다.QGraphicsView의 보이는 장면 사각형을 얻는 방법?

보이는 장면 사각형을 파악할 수있는 방법이 있습니까?

+2

나는 이것이 당신이 찾고있는 것이라고 생각합니다 : http://stackoverflow.com/questions/1355446/get-visible-rectangle-of-qgraphicsview. –

답변

1

QGraphicsView는 QWidget :: geometry() 함수를 상속받습니다. 이를 사용하여 상위 위젯 내에서 위치와 크기를 결정할 수 있습니다. (생성자 바깥 쪽)

QGrapicsScene은 QGraphicsView보다 클 수 있습니다. 기본 QGraphicsView는 QGraphicsScene을 수용 할 수있는 가로 및 세로 스크롤 막대를 추가합니다. 난 당신이 같은 것을 할 싶습니다 상상 :

//create a QGraphicsScene (for this example *scene) that is the size of your entire map. 
QGraphicsScene *scene=new QGraphicsScene(0,0,mapWidth,mapHeight); 
//create a QGraphicsView* named view that is the size of your visible area 
//I'm assuming visibleHeight and visibleWidth do not change (this is your viewing window) 
QGraphicsView *view=new QGraphicsView(0,0,visibleWidth,visibleHeight); 
view->setScene(scene); 

사용자가 sceneMoved(int,int) 같은 일부 사용자 정의 신호를 트리거 장면의 x와 y 위치를 제어하게한다.

connect(this,SIGNAL(sceneMoved(int,int)),this,SLOT(drawScene(int,int))); 

void SomeClass::drawScene(int newX, int newY){ 
//if you already have a pointer to the scene do this, or call 
//QGraphicsView::scene(); 
    int oldX=scene->geometry()->x(); 
    int oldY=scene->geometry()->y(); 
    //now that you have your oldX, oldY, newX, and newY, visibleWidth, visibleHeight 
    //you can determine what you need to redraw, what you need to delete, and what can stay 
} 

여전히에서는 if..else이 많이 있습니다,하지만 당신은 요점 : 당신이 장면을 다시 그리기 전에, 장면의 새로운 위치를 확인하기 위해 슬롯을 호출합니다. 가시 영역 크기만큼 맵을 사각형으로 분할하는 것이 좋습니다.

+0

sceneMoved 신호 란 무엇입니까? Qt4에 ID가 없습니다. – rednaks

+0

사용자가 트리거 한 맞춤 신호입니다. 그것은 명확한 설명이 필요했습니다. – buster

3

이 당신에게 눈에 보이는 장면 사각형 제공합니다 경우

sceneRect = graphicsView.mapToScene(graphicsView.rect()).boundingRect() 

전단 또는 회전 변환이 당신에게 보이는 장면 영역의 경계 사각형을주는 선물이있다. 그러한 변환 (이동 또는 확대/축소 만)이없는 경우 반환 된 사각형은 정확한 장면 영역입니다.

이제 장면에 거대한 타일 맵을 효율적으로 표시하는 실제 문제가 있습니까? 백그라운드에서 타일을로드하고 Qt 프레임 워크가 가시 범위 밖에있는 큰 픽스맵에 대해 최적화되어 있지 않은지 먼저 평가합니다. 30MB는 너무 크게 들리지 않아서 메모리에 맞지 않습니다.

관련 문제