qt widgets 中 view scene item的体系

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)

你可能感兴趣的:(qt widgets 中 view scene item的体系)