QGraphicsView系统坐标映射关系
2017-08-12 22:16
190 查看
如果你英文足够好,可以参考Qt帮助文档中的:The Graphics View Coordinate System。
---------------------------------------------------------------------------------------------------------------------------
首先,先上显示界面图(Embeded dialog),下面就是以该实例讲解:
1。QGraphicsItem及其衍生类以及其他可作为图元的类,总称Item(图元)类
Item坐标,属于局部坐标。通常以图元中心为原点(中心对称);非中心对称类,比如dialog类,一般以左上角为原点。故Item坐标的原点,需要具体问题具体分析。正方向x朝右,y朝下。除setPos函数外,所有Item类使用或得到的坐标都是该Item坐标。
1)boundingRect()返回外边框的左上顶点在item中的坐标(区别于原点,原点是(0,0)点,但是外边框由于具有宽度,所以肯定在原点的左上角,因此得到的坐标肯定是(负数,负数)的),比如下图:
输出:
对应到显示的点位如下:
2) setPos的坐标是父类坐标系的坐标,一般对于item位于scene中的应用场景,setPos对应的坐标就是scene(场景)坐标,输入的位置pos意思是该图元的原点在所在的场景坐标中的坐标,即该图元在场景中放置的位置。可以通过调用pos或scenePos查看。比如下图:
输入(红色框出部分):
对应到显示的点位如下:
注:个人认为应该是第一个dialog的坐标原点。也就是默认的scene与整个item的原点(即左上角dialog的原点)对齐。此时dialog外边框顶点在场景中的位置将为(负数,负数),而非(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)而是(负数,负数)。如下图:
1)itemsBoundingRect()返回场景中所有item的外框顶点坐标和所有item整体的长宽。由于采用动态遍历所有图元的方法,所以当图元较多时,这个计算比较耗时。如图如下:
输出如下:
界面计算如下:
2)sceneRect()返回场景中可以看到的区域的顶点和长宽,可以看到的区域区别于所有图元的外边框itemsBoundingRect的顶点和长宽,一般二者是相同的,只有当出现图元移除时,二者才不同。因为sceneRect不能减少只能增加,故移除图元不能使可见的区域缩小,从而sceneRect不变,但是itemsBoundingRect()将减小。可以通过setSceneRect来重新设定区域的顶点和长宽。如图所示:
输出如图:
注:secene的sceneRect()不是可视的secene的大小,而是大部分时间和itemsBoundingRect()的大小相同!
3。QGraphicsView类,即View(视图)类
视图坐标,属于设备坐标device coordinates(与窗口相同),默认以左上点为原点,正方向x朝右,y朝下,此时坐标总是正值。当然,也可以通过调用函数translate更改视图坐标的原点位置,从而使试图坐标既有正值又有副值。显示时,默认场景scene的左上角顶点(一般肯定不是secene的(0,0)坐标点)与视图坐标原点对齐。又由于显示时默认中心对齐,当场景大小小于视图大小的时候,将中心对齐,此中指的仍然是整个图元的中心,同时,图元原点与场景原点对齐,场景左上角顶点与视图原点对齐,视图左上角顶点不一定是原点,此时也将出现视图坐标有正值有负值。
1)translate()将当前视图坐标原点平移,从而实现显示图像的平移变换。由于默认场景的左上角顶点与视图坐标原点对齐,translate()将坐标原点平移,也就实现了将场景的平移。
2)rotate()将当前视图围绕视图坐标原点旋转,从而实现显示图像的旋转变换。
3)size()返回视图大小,默认大小100*30,由于视图可以是无限大小而且只有在显示后才创建出实际尺寸,因此只有在showEvent中调用size 函数才能正确显示视图大小,否则都是返回默认的100*30,因为此时视图尚未显示,即尚未形成。
---------------------------------------------------------------------------------------------------------------------------
首先,先上显示界面图(Embeded dialog),下面就是以该实例讲解:
1。QGraphicsItem及其衍生类以及其他可作为图元的类,总称Item(图元)类
Item坐标,属于局部坐标。通常以图元中心为原点(中心对称);非中心对称类,比如dialog类,一般以左上角为原点。故Item坐标的原点,需要具体问题具体分析。正方向x朝右,y朝下。除setPos函数外,所有Item类使用或得到的坐标都是该Item坐标。
1)boundingRect()返回外边框的左上顶点在item中的坐标(区别于原点,原点是(0,0)点,但是外边框由于具有宽度,所以肯定在原点的左上角,因此得到的坐标肯定是(负数,负数)的),比如下图:
输出:
对应到显示的点位如下:
2) setPos的坐标是父类坐标系的坐标,一般对于item位于scene中的应用场景,setPos对应的坐标就是scene(场景)坐标,输入的位置pos意思是该图元的原点在所在的场景坐标中的坐标,即该图元在场景中放置的位置。可以通过调用pos或scenePos查看。比如下图:
输入(红色框出部分):
对应到显示的点位如下:
注:个人认为应该是第一个dialog的坐标原点。也就是默认的scene与整个item的原点(即左上角dialog的原点)对齐。此时dialog外边框顶点在场景中的位置将为(负数,负数),而非(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)而是(负数,负数)。如下图:
1)itemsBoundingRect()返回场景中所有item的外框顶点坐标和所有item整体的长宽。由于采用动态遍历所有图元的方法,所以当图元较多时,这个计算比较耗时。如图如下:
输出如下:
界面计算如下:
2)sceneRect()返回场景中可以看到的区域的顶点和长宽,可以看到的区域区别于所有图元的外边框itemsBoundingRect的顶点和长宽,一般二者是相同的,只有当出现图元移除时,二者才不同。因为sceneRect不能减少只能增加,故移除图元不能使可见的区域缩小,从而sceneRect不变,但是itemsBoundingRect()将减小。可以通过setSceneRect来重新设定区域的顶点和长宽。如图所示:
输出如图:
注:secene的sceneRect()不是可视的secene的大小,而是大部分时间和itemsBoundingRect()的大小相同!
3。QGraphicsView类,即View(视图)类
视图坐标,属于设备坐标device coordinates(与窗口相同),默认以左上点为原点,正方向x朝右,y朝下,此时坐标总是正值。当然,也可以通过调用函数translate更改视图坐标的原点位置,从而使试图坐标既有正值又有副值。显示时,默认场景scene的左上角顶点(一般肯定不是secene的(0,0)坐标点)与视图坐标原点对齐。又由于显示时默认中心对齐,当场景大小小于视图大小的时候,将中心对齐,此中指的仍然是整个图元的中心,同时,图元原点与场景原点对齐,场景左上角顶点与视图原点对齐,视图左上角顶点不一定是原点,此时也将出现视图坐标有正值有负值。
1)translate()将当前视图坐标原点平移,从而实现显示图像的平移变换。由于默认场景的左上角顶点与视图坐标原点对齐,translate()将坐标原点平移,也就实现了将场景的平移。
2)rotate()将当前视图围绕视图坐标原点旋转,从而实现显示图像的旋转变换。
3)size()返回视图大小,默认大小100*30,由于视图可以是无限大小而且只有在显示后才创建出实际尺寸,因此只有在showEvent中调用size 函数才能正确显示视图大小,否则都是返回默认的100*30,因为此时视图尚未显示,即尚未形成。
相关文章推荐
- Qt中QGraphicsView三种坐标系统详解
- OpenGL 纹理坐标 和 顶点坐标映射关系 详解
- Android 屏幕(View)坐标系统
- Android 屏幕(View)坐标系统
- 使用对象-关系映射(ORM)系统中间件提升软件开发效率及质量
- Android 屏幕(View)坐标系统
- Android 屏幕(View)坐标系统
- 摄影测量与计算机视觉坐标系统转换和一些基本量的关系
- Graphics View 坐标系统
- 使用对象-关系映射(ORM)系统中间件提升软件开发效率及质量
- Graphics View 坐标系统
- Android 屏幕(View)坐标系统
- 数据库系统概念中table/view/schema/index的关系
- Android 屏幕(View)坐标系统
- 使用对象-关系映射(ORM)系统中间件提升软件开发效率及质量
- android系统View、Window、Activity、Dispay之间的关系
- 坐标系统、映射模式
- 使用对象-关系映射(ORM)系统中间件提升软件开发效率及质量
- 在Win7中修改 系统盘中 “系统” - “用户” 的环境变量映射关系
- 使用对象-关系映射(ORM)系统中间件提升软件开发效率及质量