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

QT图形显示和处理2 坐标系统(重点)

上一节我们讲了基本的绘图,这一节将重点讲述什么是二维坐标系。

大多数博客和书对QT的坐标讲解非常粗浅,两个非常重要的函数setWindow和setViewport都没有说清楚。这一节将重点讲一下坐标系统。

先上一段代码:

QPainter painter(this);
QPen pen(Qt::green,5,Qt::SolidLine,Qt::RoundCap,Qt::RoundJoin);
painter.setPen(pen);
painter.drawLine(QPoint(50, 50), QPoint(150, 150));

painter.save();
painter.rotate(10);//旋转是绕着坐标0点旋转的
painter.drawLine(QPoint(50, 50), QPoint(150, 150));
painter.restore();

这些跟上一节一样,都是定义在paintEvent里面的。首先先画了一条线,然后保存当前坐标系,把坐标系转了10度,然后画线,最后再恢复原来的坐标系

什么意思呢?其实就是整个坐标系包括里面画的东西沿着原点(0,0)顺时针转了10度,再显示到屏幕上:

注意这里的绿色方框代表了窗口。程序显示结果如下:

注意上面的是第一条线,下面的是转下去的第二条线。

我们再讲一下什么是默认坐标系:

我们创建的窗口大小是1100*800的,默认状态下,它的坐标系就是:左上角是(0,0),右下角是(1100,800)。我们画线(50,50)——(100,100),就会在该坐标系上画出来。

现在我们重新设置一下坐标系

painter.setWindow(-width() / 2, -height() / 2, width(), height());
painter.drawLine(QPoint(0, 0), QPoint(150, 150));
painter.save();
painter.rotate(90);//旋转是绕着坐标0点旋转的
painter.drawLine(QPoint(0, 0), QPoint(150, 150));
painter.restore();

显示效果如下:

首先先看这句话:

painter.setWindow(-width() / 2, -height() / 2, width(), height());

这句话把窗口的最左上角设置为了(-width() / 2, -height() / 2),width()和height()是窗口的长和宽。经过这样设置,以前的窗口中心坐标是(width() / 2, height() / 2),现在的窗口的中心点变成了(0,0)。即setWindow把窗口进行重新设置,前两个参数设最左上角的点的坐标,后两个参数设置长和宽。

为了更好理解,我们再添加这么一段程序:

	painter.setWindow(-100, -100, 200, 200);
	painter.drawLine(QPoint(-100, -100), QPoint(100, 100));

现在显示的效果如下:

注意,这样设置相当于把(-100,-100)——(100,100)之间的内容映射到原来(0,0)——(1100,800)的窗口里,所以这个线不是45度的,因为不是等长宽比映射,以及它变粗了,因为映射放大了。

所以,setWindow的意义在于,我们已经定义一个区间,在这个区间上画的内容会被映射到真实的显示区域(物理区域)。

而大家应该记得之前说的,rotate是绕着原点(0,0)旋转整个屏幕的,所以说中间的成90度的角就是这么旋转过去的。

大家仔细理解一下setWindow的效果,然后下一节会重点介绍另一个函数:setViewport,这是坐标系统里最难理解的部分。

相关文章:

  • QT图形显示和处理3 坐标系统(重点)
  • QT图形显示和处理4
  • QT图形显示和处理5
  • QT图形显示和处理6
  • QT图形显示和处理7
  • QT图形显示和处理8
  • QT传输函数控件设计1 引子
  • QT传输函数控件设计2 体渲染和VTK
  • QT传输函数控件设计3 QVTKWidget和QT图形界面的融合
  • QT传输函数控件设计4 接着进行融合
  • QT传输函数控件设计5 显示体渲染效果
  • QT传输函数控件设计6 设计Dock窗体结构
  • QT传输函数控件设计7 边界和布局规划
  • QT传输函数控件设计8 设计小圆点
  • QT传输函数控件设计9 初步设计视口类
  • -------------------- 第二讲-------- 第一节------在此给出链表的基本操作
  • 《Javascript数据结构和算法》笔记-「字典和散列表」
  • CODING 缺陷管理功能正式开始公测
  • FineReport中如何实现自动滚屏效果
  • IndexedDB
  • k8s如何管理Pod
  • Linux gpio口使用方法
  • Linux下的乱码问题
  • Mysql优化
  • PAT A1120
  • Python 反序列化安全问题(二)
  • React-生命周期杂记
  • Terraform入门 - 3. 变更基础设施
  • V4L2视频输入框架概述
  • vue数据传递--我有特殊的实现技巧
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 反思总结然后整装待发
  • 快速构建spring-cloud+sleuth+rabbit+ zipkin+es+kibana+grafana日志跟踪平台
  • 浏览器缓存机制分析
  • 学习笔记TF060:图像语音结合,看图说话
  • 用Node EJS写一个爬虫脚本每天定时给心爱的她发一封暖心邮件
  • 原生 js 实现移动端 Touch 滑动反弹
  • 格斗健身潮牌24KiCK获近千万Pre-A轮融资,用户留存高达9个月 ...
  • 微龛半导体获数千万Pre-A轮融资,投资方为国中创投 ...
  • #调用传感器数据_Flink使用函数之监控传感器温度上升提醒
  • $emit传递多个参数_PPC和MIPS指令集下二进制代码中函数参数个数的识别方法
  • (1) caustics\
  • (LeetCode 49)Anagrams
  • (Mirage系列之二)VMware Horizon Mirage的经典用户用例及真实案例分析
  • (附源码)计算机毕业设计SSM保险客户管理系统
  • (附源码)计算机毕业设计SSM疫情社区管理系统
  • (牛客腾讯思维编程题)编码编码分组打印下标(java 版本+ C版本)
  • (万字长文)Spring的核心知识尽揽其中
  • (一)Mocha源码阅读: 项目结构及命令行启动
  • (转) 深度模型优化性能 调参
  • (转)es进行聚合操作时提示Fielddata is disabled on text fields by default
  • (转载)跟我一起学习VIM - The Life Changing Editor
  • .NET 4.0网络开发入门之旅-- 我在“网” 中央(下)
  • .Net core 6.0 升8.0
  • .net framework profiles /.net framework 配置