当前位置: 首页 > news >正文

QGraphics View坐标系

QGraphics View绘图结构依赖三个类:QGraphicsScene,QGraphicsView,QGraphicsItem。

这三者的关系在前面已经介绍过:Graphics View 绘图架构-CSDN博客

这里介绍下这三者的坐标系,以及如何相互转换。


 

1. QGraphicsScene 坐标系

描述QGraphicsScene 使用的是场景坐标系,这是一个笛卡尔坐标系,其中 (0, 0) 通常是场景的左上角。

用途: 用于确定图形项在场景中的位置。

范围: 场景坐标系可以非常大,支持大量的图形项。

2. QGraphicsView 坐标系

描述QGraphicsView 使用的是视图坐标系,这也是一个笛卡尔坐标系,其中 (0, 0) 通常是视图的左上角。

用途: 用于确定用户在视图中的操作位置,如鼠标点击、拖动等。

范围: 视图坐标系通常与视图的大小一致,但可以通过缩放和平移操作改变。

3. QGraphicsItem 坐标系

描述QGraphicsItem 使用的是本地坐标系,其中 (0, 0) 通常是图形项的局部原点。这个原点的具体位置取决于图形项的类型和构造方式。以下是一些常见图形项的默认原点位置:

  • QGraphicsRectItem(0, 0, 100, 100); // 创建的矩形,其左上角在 (0, 0),右下角在 (100, 100)。
  • QGraphicsEllipseItem(0, 0, 100, 100); // 创建的椭圆,其左上角在 (0, 0),右下角在 (100, 100)。
  • QGraphicsPolygonItem;  // (0, 0) 是多边形的第一个顶点。
  • QGraphicsPathItem;  // (0, 0) 是路径的起始点。
  • 自定义QGraphicsItem,对于自定义的 QGraphicsItem,(0, 0) 的位置完全由你在重写的 boundingRect 和 paint 方法中定义。

用途: 用于确定图形项内部的细节,如子项的位置、形状等。

范围: 本地坐标系通常与图形项的大小一致,但可以有更复杂的变换(如旋转、缩放)。

4. 三者坐标之间的相互转换

鼠标事件的传递方向是:视图view -> 场景scene -> 图元item。详情可参考之前的博文 Graphics View 绘图架构-CSDN博客

所以这里将关注的转换路径:视图view坐标 -> 场景scene坐标 -> 图元item坐标

这些坐标的变换都是通过两端对象的方法控制,要么是view对象,要么是item对象。

4.1 视图坐标和场景坐标

通过view控制

(1)视图坐标 -> 场景坐标系: QPointF scenePos = view->mapToScene(viewPos);wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

(2)场景坐标 -> 视图坐标系: QPoint viewPos = view->mapFromScene(scenePos);

4.2 场景坐标系和图形项坐标

通过item控制

(1)场景坐标 -> 图形项的本地坐标系:QPointF itemPos = item->mapFromScene(scenePos);

(2)图形项的本地坐标 -> 场景坐标系: QPointF scenePos = item->mapToScene(itemPos); 

4.3 视图坐标和图形项坐标

中间都要经过场景坐标。

(1)视图坐标 -> 图形项的本地坐标系:

QPointF scenePos = view->mapToScene(viewPos);
QPointF itemPos = item->mapFromScene(scenePos);

(2)图形项的本地坐标 -> 视图坐标系

QPointF scenePos = item->mapToScene(itemPos);
QPoint viewPos = view->mapFromScene(scenePos);

http://www.lryc.cn/news/474888.html

相关文章:

  • 繁星之下--
  • Transformer+KAN系列时间序列预测代码
  • vue项目安装组件失败解决方法
  • C++ [项目] 躺平发育
  • [产品管理-55]:产品设计不仅仅完成功能,即可用性设计,还需要完成可生产性、可装配性、可维护性、可回收性、可服务性设计
  • Mount Image Pro,在取证安全的环境中挂载和访问镜像文件内容
  • 玩转Docker | Docker基础入门与常用命令指南
  • 【MySQL】MySQL安装以及各种报错处理
  • 【传知代码】图像处理解决种子计数方法
  • WPF 特性------Binding
  • 深入解析 FastAPI 查询参数:配置、类型转换与灵活组合
  • 大学城水电管理系统开发:Spring Boot指南
  • Lua 从基础入门到精通(非常详细)
  • [MySQL#11] 索引底层(2) | B+树 | 索引的CURD | 全文索引
  • 一个指针可以被声明为 `volatile`
  • [0260].第25节:锁的不同角度分类
  • android数组控件Textview
  • openpnp - 手工修改配置文件(元件高度,size,吸嘴)
  • Java 集合一口气讲完!(中)d=====( ̄▽ ̄*)b
  • 位运算:计算机科学中的基本操作
  • MPSK(BPSK/QPSK/8PSK)调制解调的Matlab仿真全套
  • 如何为STM32的EXTI(外部中断)编写程序
  • 八、快速入门Kubernetes之service
  • JVM 类加载机制详解
  • 在 JavaScript 中,`Array.prototype.filter` 方法用于创建一个新数组,该数组包含通过测试的所有元素
  • 63 mysql 的 行锁
  • ubuntu文件编辑操作
  • Nuxt.js 应用中的 nitro:config 事件钩子详解
  • 【前端】项目中遇到的问题汇总(长期更新)
  • DAY73WEB 攻防-支付逻辑篇篡改属性值并发签约越权盗用算法溢出替换对冲