QT Graphics View坐标系转换

news/2024/11/14 21:00:11/

背景

在做绘图处理时,Scence作为场景,大小是无限的,而View作为一个观察镜头,观察范围是有限的。
那么有限的View观察无限的Scence区域,必然要选定一个观测锚点。
所以View具有一个centerOn(QPointF pos)函数,输入的是Scence的坐标,把SCence中位于pos的点显示在View的中心。即以Scence的pos点作为View观察的中心。

中心点坐标分析

默认情况下,View是选择ScenceRect的中心点作为观察中心的。
Scence是无限大的,但是我们作画一般是在Scence的某一区域进行的,所以可以对Scence设置一个ScenceRect,如果不设置,那么系统会计算你画的所有Item的边界并集当做ScenceRect,这样效率不高。
一般情况下,会手动给Scence设置一个ScenceRect。设置好之后,View的中心点就是这个ScenceRect的中心点。
具三个例子来说明如下:

ScenceRect比View小

view的大小为:1200*687
senceRect大小为(0,0,200,200)

	QRect rect(0,0,200,200);m_scence->setSceneRect(rect);m_scence->addRect(rect);m_scence->addRect(QRectF(0,0,100,100));m_scence->addRect(QRectF(100,100,50,50));m_scence->addItem(rectItem1);ui->graphicsView->setScene(m_scence);

效果如下,View以SenceRect的中点(100,100)为中心点:
在这里插入图片描述

ScenceRect与View相等

当ScenceRect与View相等时,那么SCenceRect的中点必然就是View的中点,此时两个坐标系的远点是重合的:
在这里插入图片描述

ScenceRect比View大

道理同上,不再赘述。

遗留问题

资料上说,Item的原点是item的中心点,但是上面的实验中的item的原点默认都是左上角。

在Item中,setPos(pos)是指把item的位置设置到pos处,pos是scence坐标,设置好之后,item的原点(0,0)就是scence的pos。

1. 不使用setpos时

 	RectGraphicsItem *rectItem = new RectGraphicsItem(QRectF(20,20,150,50));rectItem->setColor(QColor(Qt::black));m_scence->addItem(rectItem);

指定了初始化的位置为(20,20)的矩形,此时item的默认原点坐标与Scence的原点坐标重合,所以如下所示:
在这里插入图片描述

2. 使用setpos时

	RectGraphicsItem *rectItem = new RectGraphicsItem(QRectF(20,20,150,50));rectItem->setColor(QColor(Qt::black));rectItem->setPos(20,20);m_scence->addItem(rectItem);

如上所示,设置了(20,20)的矩形后,会在Scence(20,20)的位置画一个矩形,setPos(20,20)后,会把item放到sence(40,40)的位置,此时item的原点坐标(0,0)不再与Scence重合,而是在Secence的(20,20)位置。
在这里插入图片描述

3. 推荐方式
如上面1和2介绍,item的内部坐标还要与父坐标系进行转换,较为复杂,在写代码绘制时,脑子要转好几个弯,造成思维混乱,为了解决这个问题,见如下代码:

//位置都从(0,0)开始
RectGraphicsItem *rectItem = new RectGraphicsItem(QRectF(0,0,150,50));
rectItem->setColor(QColor(Qt::black));
rectItem->setPos(20,20);//然后平移到sence的(20,20)位置,此时item的(0,0)就是此点
m_scence->addItem(rectItem);
  • 初始化rect时,总是设置为(0,0)。
  • 使用setpos设置到相应的位置(x,y),如上面的(20,20)。
  • 这样,item的原点就是(x,y),对item内部来说总是以左上角(0,0)为坐标的原点,item的坐标不至于混乱。结果与1中的对比如下:
    在这里插入图片描述

http://www.ppmy.cn/news/42962.html

相关文章

SFSpeechRecognitionTask.error 错误码对照表

iOS 语音识别引擎中常见错误对照表 加注释了 error An error object that specifies the error that occurred during a speech recognition task. iOS 10.0 macOS 10.15 Mac Catalyst 13.1 Declaration property(nonatomic, readonly, copy, nullable) NSError *error;…

uview-ui工具函数的使用

uview-ui工具函数的使用安装在main.js全局引入工具函数的使用1. 函数防抖、节流2. 对象转url参数3. 路由封装4. 时间格式化5. 求两个颜色渐变之间的值6. 生成全局唯一guid字符串7. 获取主题相关颜色8. 根据type获取图标名称9. 打乱数组的顺序10. 对象和数组的深度克隆11. 对象和…

2.4 随机变量函数的分布

学习目标: 学习随机变量函数的分布,我会采取以下步骤: 熟悉随机变量的基本概念和分布:在学习随机变量函数的分布之前,需要先掌握随机变量的基本概念和分布,包括离散型随机变量和连续性随机变量的概率密度…

UTF-8(Unicode Transformation Format)

文章目录一、Unicode示例代码:二、网络传输与Unicode三、UTF-8如何编码四、使用UTF-8转换传输Unicode五、利用Java-API进行UTF8编码和解码六、利用代码输出Unicode编码和UTF8编码七、手写UTF8编码、解码八、总结UTF8一、Unicode 示例代码: package demo…

项目管理中的冲突是什么?

项目管理中的冲突可以采取多种不同的形式。团队成员在创意愿景上存在分歧,与高层管理人员就期望和时间表发生争执,甚至与第三方供应商发生争执,都是项目冲突的主要例子。 冲突的常见原因是什么? 基于项目的组织内部冲突的典型原因…

Effective C++学习笔记

Effective C 学习笔记一、习惯C1、C是一个语言的组合2、尽量使用const、enum、inline替换#define3、尽可能的使用const4、对象使用前要初始化二、构造、析构和赋值运算5、C默认生成的函数6、不想要编译器自动生成的函数,要明确约束7、多态基类析构函数必须声明为vir…

openEuler 单机部署 Hadoop SingleNode 模式

openEuler 单机部署 Hadoop SingleNode 模式 升级操作系统和软件 yum -y update升级后建议重启 安装常用软件 yum -y install gcc gcc-c autoconf automake cmake make rsync openssh-server vim man zip unzip net-tools zlib zlib-devel openssl openssl-devel pcre-devel…

【 SpringBoot ⽇志⽂件 】

文章目录一、⽇志的作用二、认识⽇志三、⾃定义⽇志打印3.1 在程序中得到⽇志对象3.2 使⽤⽇志对象打印⽇志3.3 ⽇志格式说明四、⽇志级别4.1 ⽇志级别的作用4.2 ⽇志级别的分类与使⽤4.2.1 ⽇志级别的分类4.2.2 ⽇志使⽤4.2.2.1 配置全局日志级别4.2.2.2 配置局部文件夹的日志…