我正在显示一个构建为QGraphicsPixmapitem项目矩形的地图(每个项目代表一个地图图块)。因为我的地图非常大(大约30 MB的PNG文件),我希望只有当它们在QGraphicsView中对用户可见时才能按需加载pixmaps,并在它们变得不可见时卸载。
有没有办法找出可见的场景矩形?
答案 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,但你明白了。我建议您尝试将地图划分为可见区域大小的正方形。