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

Qt: QGraphicsView二维图形绘图框架

坐标

主要坐标包含三类:
QGraphicsView坐标: 	视图坐标,即显示窗口的坐标,和屏幕尺寸是1:1
QGraphicsScene坐标:	场景坐标,被观察场景的坐标,通过缩放和平移比例可以转换为视图坐标 
QGraphicsItem坐标:  	图形项坐标,每一个图形项都有一个自己的坐标系,有可能是这个图形项的左上角也可能是中心。由这个图形项的boundingRect()定义

以上三个坐标系相互独立。可以通过trans()转换矩阵进行转换。

坐标转换:
视图到场景:view->mapToScene(QPoint);//这里注意视图坐标是int型,对应屏幕的像素
场景到视图:view->mapFromScene(QPointF);//场景坐标是double,可以有亚像素
场景到图形项:QPointF QGraphicsItem::mapFromScene(qreal ax, qreal ay)。item->mapFromScene(scene_pos);//讲一个场景的坐标转换到图形项坐标系下
图形项到场景:QPointF QGraphicsItem::mapToScene(qreal ax, qreal ay)。item->mapToScene(item_pos);将图形项的坐标转换为场景坐标
坐标设置和获取
  1. 设置:推荐使用setPos()

使用 setPos() 方法 该方法用于设置 QGraphicsItem 在其父项坐标系中的位置;默认直接添加在场景中的图形项设置的就是item在场景中的坐标;

item->setPos(x, y); // 设置左上角坐标为 (x, y)

使用 setRect() 方法(对于 QGraphicsRectItem) 如果你使用的是 QGraphicsRectItem,可以通过 setRect() 同时设置位置和大小

rectItem->setRect(x, y, width, height); // 设置位置和大小;这里设置的位置坐标系是rectItem的坐标系,
								//不过改变rectItem在scene下的坐标。但是这里设置后再显示效果上和setPos()是一样的
  1. 获取:推荐使用scenePos()。

使用 pos() 方法 该方法返回 QGraphicsItem 在其父项坐标系中的位置

QPointF position = item->pos();//若item已经添加在场景中,则pos和scenePos相同

使用 scenePos() 方法 该方法返回 QGraphicsItem 在场景坐标系中的绝对位置。

QPointF scenePosition = item->scenePos();

示例1:获取鼠标所在的位置是否在某一个QGraphicsRectItem中

    QPoint view_pos = event->pos();//从事件中获取鼠标的view坐标
    QPointF scene_pos = this->mapToScene(view_pos);//view坐标转换为scene坐标
	QPointF rect_pos = rect_item->mapFromScene(scene_pos );//将scene坐标转换为item坐标系下的坐标
    rect_item->contains(rect_pos);//使用rect的contains函数进行判断

http://www.kler.cn/a/284979.html

相关文章:

  • 15 个改变世界的开源项目:塑造现代技术的先锋力量
  • GitLab实现 HTTP 访问和 SMTP 邮件发送
  • 使用docker形式部署jumpserver
  • 产品经理如何使用项目管理软件推进复杂项目按时上线
  • 解耦与模块化:鸿蒙平台上的服务注册与查找机制
  • 【ARM】MDK-烧录配置文件无权限访问
  • sql 4,创建表类型
  • HTML <template> 标签的基本技巧
  • flutter 开发中常用的 Widget
  • Metasploit漏洞利用系列(十):MSF渗透测试 - 震网三代(远程快捷方式漏洞)实战
  • Elasticsearch中别名的作用
  • .NET WPF 抖动动画
  • python 天气与股票的关系--第一部分,爬取数据
  • 新审视零阶优化在内存高效大模型微调中的应用
  • 你是如何克服编程学习中的挫折感的?——从Bug中找到成长的契机
  • Linux awk案例
  • Dataworks_PySpark开发流程
  • azure-search-openai-demo-csharp does not deploy correctly to azure clooad
  • vue项目打包压缩静态资源—使用compression-webpack-plugin
  • 是否应该使用WordPress自动更新的功能
  • ComfyUI使用Flux模型
  • 黑马JavaWeb开发笔记07——Ajax、Axios请求、前后端分离开发介绍、Yapi详细配置步骤
  • 网络压缩之参数量化(parameter quantization)
  • Spring Boot发送http请求
  • C语言补习课
  • gdb 教程