我正在顯示構建爲QGraphicsPixmapitem項目矩形的地圖(每個項目代表一個地圖圖塊)。因爲我的地圖非常大(大約30 MB的PNG文件),我希望只有當它們在QGraphicsView中對用戶可見時才能按需加載像素圖,並在它們變得不可見時進行卸載。如何獲取QGraphicsView的可見場景矩形?
有什麼辦法可以找出可見的場景矩形?
我正在顯示構建爲QGraphicsPixmapitem項目矩形的地圖(每個項目代表一個地圖圖塊)。因爲我的地圖非常大(大約30 MB的PNG文件),我希望只有當它們在QGraphicsView中對用戶可見時才能按需加載像素圖,並在它們變得不可見時進行卸載。如何獲取QGraphicsView的可見場景矩形?
有什麼辦法可以找出可見的場景矩形?
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的,但你明白了吧。我建議嘗試將您的地圖分割爲可見區域的大小。
這給你一個可視景象矩形:
sceneRect = graphicsView.mapToScene(graphicsView.rect()).boundingRect()
但如果是剪切或旋轉變換展示它給你看到景區的邊框。如果你沒有這樣的轉換(只是移位或縮放),返回的矩形就是確切的場景區域。
現在你真正的問題是有效地在場景中顯示一個巨大的瓷磚地圖?您可以在後臺加載圖塊,並首先評估您的Qt框架是否已經針對可見範圍之外的大圖像進行了優化。 30 MB也聽起來不那麼大,不適合內存。
我想這就是你要找的東西:http://stackoverflow.com/questions/1355446/get-visible-rectangle-of-qgraphicsview。 –