view 中的是设备的物理坐标,以左上角为原点,x向右增大,y向下增大
scene中是逻辑坐标,默认也是左上角为原点,x向右增大,y向下增大。但你可以修改成其他坐标系,比如,修改成以左下角为原点的坐标系,则在处理Y方向数据时做如下处理即可: 逻辑坐标中的Y=scene的高度-输入的Y坐标
item中的坐标系,是独立的,以item的左上角为原点,x向右增大,y向下增大。实际在处理item中的子项目时,使用的也是scene中的坐标,估计是在 addItem后,item结合自身位置对这些坐标做了处理。
缩放问题:
在view 中 wheelEvent中处理鼠标滚轮事件时,确定好缩放比例后,最终调用scale实现缩放。
需要注意的是,缩放是针对当前view再进行的缩放,而不是原始view进行的缩放,比如原始view是一个1x1的正方形,在执行 scale(2,2)后变成一个2x2的正方形,此时再执行 scale(2,2),会变成一个4x4的正方形,而不是一个2x2的正方形!
还需要注意缩放时会有除法除不干净的问题,比如放大时因为最大显示范围的限制,可能刚好最大显示范围除以当前范围是个无限不循环小数,此时如果缩小,会发现图像缩小异常。我的处理办法是只放大整数倍和缩小整数倍。
引入缩放后,scene中处理Y公式如下: Y=(scene的高度-输入的Y坐标)*scale
分辨率问题:
这个是地图引入的,比如地图中一个像素代表多少个mm。此时scene中处理Y公式如下: Y=(scene的高度-输入的Y坐标/resolution) *scale resolution表示地图文件中一个像素代表多少个mm
地图的拖动问题:
假定用按下鼠标右键开始拖动,松开鼠标右键结束拖动,则:
在view 中mousePressEvent 中标记拖动的开始,记录第一次拖动时的鼠标位置,使用view坐标
在view中mouseMoveEvent中通过计算前一次鼠标的位置和当前鼠标位置的差值,并通过mapToScene转换成 scene坐标后:
1.先设置 setTransformationAnchor(QGraphicsView::AnchorUnderMouse)
2.再设置 centerOn,注意,使用的是scene坐标
3。设置 setTransformationAnchor(QGraphicsView::AnchorViewCenter)
item的旋转问题:
我使用的是itemGroup,实际item效果应该和itemGroup一致。
让item围绕自己的中心在Z方向旋转,默认的旋转方向是顺时针,所以如果要旋转45度,应该传入-45。
以下使用的都是scene坐标。
假定 item 的坐标为 px,py ,scene的高度为 rows
QTransform trans=QTransform().translate(px,rows-py).rotate(-45).translate(-px,-rows+py)
item.setTransform(trans)