白话讲解setSceneRect
QGraphicsScene::setSceneRect ( qreal x, qreal y, qreal w, qreal h );
w,h 是寬高值,无需解释.
x,y 是左上角坐标,它是参考scene 坐标系的.
讲清这个位置有点绕, 还是用白话说吧,能读懂需要一定基础. 首先有2个坐标系的概念场景坐标系,视口坐标系.
问: setSceneRect(x,y,w,h), 其x,y 左上角坐标到底是什么意思? 哪个坐标系?
答: 经研究, x,y左上角的数值是随便可以定义的,0值,负值,正值都可以,你当然应该选择一个有意义的值,例如
显示窗口的一半长度(负值).
这个x,y 值决定了scene 坐标系的原点. 是不是有点绕? 反过来了, x,y值决定了原点位置,决定了scene坐标系!
而graphicItem 位置是针对scene 坐标系的.
关键在于不管x,y如何设置,如果scene 的宽度,高度与view 的宽度,高度相同的话, 则scene 的左上角会对应到
view 的左上角, 当我们把view 拉大, 则scene 会向里挪,对应到view 的中部区域.
由于这个不变性,我们知道x,y 的不同数值,将会影响scene坐标原点在视图中的位置.从而影响graphickItem setPos()设置.
较好的一种设置方法是把scene 的原点设置到view 的中心点, 这样不管拉大缩小,scene 的坐标原点都不会动了.方便位置计算.
如果你不限麻烦,这个中心点是可以随便设定的,但setPos()数值就要重新计算了.
常用的设置方法
setSceneRect(-width/2,-height/2,width,height);
备选的设置方法
setSceneRect(0,0,width,height)
这两种方法, graphicItem 调用setPos()函数的计算方法是不一样的.
其它设置方法不推荐
小结:
不变性是scene 在视口的中央.
x,y值将决定scene的坐标原点.
graphichItem 会参考scene坐标系.
------------------------------------------------------------
不能光说不练,给几个函数参考一下,重点是view->mapToScene(), view->mapFromScene()
// 视图坐标原点(0,0)对应场景坐标(场景坐标)
qDebug() << "view->mapToScene(0, 0):" << view->mapToScene(0, 0);
// 场景坐标原点(0,0)对应视图坐标(视图坐标)
qDebug() << "view->mapFromScene(0, 0):" << view->mapFromScene(0, 0);
// 场景左上角坐标(场景坐标)
QPointF p1 = QPointF(gScene->sceneRect().topLeft());
qDebug() << "p1:" << p1;
// 场景左上角对应视图坐标(视图坐标)
qDebug() << "view->mapFromScene(p1.x(), p1.y())" << view->mapFromScene(p1.x(), p1.y());
不管怎样设置x,y值, 场景左上角对应到视图中的坐标是不变的. 神奇性在这里, qt为我们背后做到了.