如果你英文足够好,可以参考Qt帮助文档中的:The Graphics View Coordinate System。
---------------------------------------------------------------------------------------------------------------------------
首先,先上显示界面图(Embeded dialog),下面就是以该实例讲解:
Item坐标,属于局部坐标。通常以图元中心为原点(中心对称);非中心对称类,比如dialog类,一般
以左上角为原点。故Item坐标的原点,需要具体问题具体分析。正方向x朝右,y朝下。除setPos函数外,所有Item类使用或得到的坐标都是该Item坐标。
1)boundingRect()返回外边框的左上顶点在item中的坐标(区别于原点,原点是(0,0)点,但是外边框由于具有宽度,所以肯定在原点的左上角,因此得到的坐标肯定是(负数,负数)的),比如下图:
输出:
对应到显示的点位如下:
输入(红色框出部分):
2。QGraphicsScene类,即scene(场景)类
scene(场景)坐标,属于逻辑坐标 logical coordinates(与QPainter相同),以场景中心
为原点,正方向x朝右,y朝下。图元嵌入场景中,默认场景原点与图元原点对齐。1、如果scene的大小不超过view可显示的最大值,那么scene在view中的默认对齐方式为居中对齐(如下图),这个中指的不是原点,而是所有item的Rect的中心点,是计算出来的;2、如果scene的大小超过view的可显示最大值,此时scene将在view中改成左上角对齐显示,左上角点也不一定是场景坐标原点(如下下图)。如下面两图对比:
注:
在上图(左上角对齐图)中,图元原点(左上角dialog的原点)与场景原点对齐,导致图元外边框的左上角顶点在场景中的坐标位置为(负数,负数),此时场景左上角点不是(0,0)而是(负数,负数)。如下图:
输出如下:
2)sceneRect()返回场景中可以看到的区域的顶点和长宽,可以看到的区域区别于所有图元的外边框
itemsBoundingRect的顶点和长宽,
一般二者是相同的,只有当出现图元移除时,二者才不同。因为sceneRect不能减少只能增加,故移除图元不能使可见的区域缩小,从而sceneRect不变,
但是itemsBoundingRect()将减小。可以通过setSceneRect来重新设定区域的顶点和长宽。如图所示:
注:secene的sceneRect()不是可视的secene的大小,而是大部分时间和itemsBoundingRect()的大小相同!
视图坐标,属于设备坐标device coordinates(与窗口相同),
默认以左上点为原点,
正方向x朝右,y朝下,此时坐标总是正值。
当然,也可以通过调用函数translate更改视图坐标的原点位置,从而使试图坐标既有正值又有副值。
显示时,默认场景scene的左上角顶点(一般肯定不是secene的(0,0)坐标点)与视图坐标原点对齐。又由于显示时默认中心对齐,当场景大小小于视图大小的时候,将中心对齐,此中指的仍然是整个图元的中心,同时,图元原点与场景原点对齐,场景左上角顶点与视图原点对齐,视图左上角顶点不一定是原点,此时也将出现视图坐标有正值有负值。
1)
translate()将当前视图坐标原点平移,从而实现显示图像的平移变换。由于默认场景的左上角顶点与视图坐标原点对齐,
translate()将坐标原点平移,也就实现了将场景的平移。
2)rotate()
将当前视图围绕视图坐标原点旋转,从而实现显示图像的旋转变换。
3)size()返回视图大小,默认大小100*30,由于视图可以是无限大小而且只有在显示后才创建出实际尺寸,因此只有在showEvent中调用
size
函数才能正确显示视图大小,否则都是返回默认的100*30,因为此时视图尚未显示,即尚未形成。