如何获得QGraphicsView的可见场景矩形?

时间:2011-11-13 15:02:43

标签: qt qgraphicsview

我正在显示一个构建为QGraphicsPixmapitem项目矩形的地图(每个项目代表一个地图图块)。因为我的地图非常大(大约30 MB的PNG文件),我希望只有当它们在QGraphicsView中对用户可见时才能按需加载pixmaps,并在它们变得不可见时卸载。

有没有办法找出可见的场景矩形?

2 个答案:

答案 0 :(得分:4)

这为您提供了可见的场景矩形:

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

如果存在剪切或旋转变换,它会为您提供可见场景区域的边界矩形。如果您没有这样的变换(仅移位或缩放),则返回的矩形就是确切的场景区域。

现在您是否真正有效地在场景中显示巨大的瓷砖地图?您可以在后台加载切片,并首先评估您的Qt框架是否已针对超出可见范围的大像素图进行了优化。 30 MB也听起来不那么大,以至于它不适合内存。

答案 1 :(得分: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);

让用户控制触发某些自定义信号的场景的x和y位置,例如sceneMoved(int,int)。在重绘场景之前,请调用一个插槽来检查场景的新位置:

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,但你明白了。我建议您尝试将地图划分为可见区域大小的正方形。