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

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

我们先从最简单的例子入手。

	QPainter painter(this);
	QPen pen(Qt::green,5,Qt::SolidLine,Qt::RoundCap,Qt::RoundJoin);
	painter.setPen(pen);
	painter.drawLine(QPoint(0,0), QPoint(150, 150));
	painter.setWindow(-width() / 2, -height() / 2, width(), height());
	painter.drawLine(QPoint(0, 0), QPoint(150, 150));

首先再paintEvent里面先放上这些代码,用来做对比。

效果如下:

接下来,我们写这么一段函数:

painter.setWindow( 0, 0, width(), height());
painter.setViewport(0,0,110,80);
pen.setColor(QColor(0, 0, 255));
painter.setPen(pen);
painter.drawLine(QPoint(0, 0), QPoint(width(), height()));

然后运行:

大家应该能注意到最左上角细细的蓝线。注意我们刚才画的线范围应该是横跨整个窗口才对呀,但是为什么现在却显示到左上角了呢?

painter.setViewport(220, 160, 110, 80);
pen.setColor(QColor(0, 0, 255));
painter.setPen(pen);
painter.drawLine(QPoint(0, 0), QPoint(width(), height()));

加这么一段代码,再输出:

这说明,第一次的时候,我们通过setViewport 把显示的区域映射到了(0,0)——(110,80),第二次的时候映射到了(220,160)——(330,240),这说明它把我们写在(0,0)——(1100,800)里面的内容分别映射到了相应物理坐标的范围里。所以线变细了。注意到线和坐标的夹角并没有改变,因为是等窗宽比映射。

现在再写这么一段程序:

pen.setColor(QColor(255, 0, 0));
painter.setPen(pen);
painter.setWindow(-100, -100, 200, 200);
painter.setViewport(0, 0, 110, 80);
painter.drawLine(QPoint(-50, -50), QPoint( 50, 50));

我们把画画的坐标系统通过 setWindow 定义为(-100,-100)——(100,100)的范围内,然后在里面进行作画,画线(-50,-50)——(50,50),然后再通过 setViewport 映射到物理屏幕(0,0)——(110,80)的区域里。

setViewport有个很奇特的性质:不裁剪性。这是什么意思呢?

我们写这么一段程序:

pen.setColor(QColor(255, 255, 0));
painter.setPen(pen);
painter.setWindow(-100, -100, 200, 200);
painter.setViewport(350, 250, 400, 300);
painter.drawLine(QPoint(-50, -50), QPoint(50, 50));
painter.drawLine(QPoint(-150, -50), QPoint(150, 50));

显示如下:

注意长的黄线,它的左端点的横坐标值小于350,右边大于750,这本身应该不可能啊,因为我们映射到的物理显示区就是(350, 250)——(750, 550),但是为什么它显示超出了这个范围呢?

这是因为我们设置的画画坐标为painter.setWindow(-100, -100, 200, 200); 但是我们画线的范围却是painter.drawLine(QPoint(-150, -50), QPoint(150, 50));超过了画画区域的范围。但是由于setViewport的非裁剪性,我们画的区域被保留下来了。

到现在,整个坐标系就讲完了,下一节再讲点零碎的知识。

相关文章:

  • 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 初步设计视口类
  • QT传输函数控件设计10 包含小圆点的图形项
  • ES6指北【2】—— 箭头函数
  • [分享]iOS开发 - 实现UITableView Plain SectionView和table不停留一起滑动
  • “Material Design”设计规范在 ComponentOne For WinForm 的全新尝试!
  • 【从零开始安装kubernetes-1.7.3】2.flannel、docker以及Harbor的配置以及作用
  • 5分钟即可掌握的前端高效利器:JavaScript 策略模式
  • canvas 绘制双线技巧
  • CSS 三角实现
  • Django 博客开发教程 16 - 统计文章阅读量
  • github指令
  • Java基本数据类型之Number
  • Map集合、散列表、红黑树介绍
  • vue脚手架vue-cli
  • 欢迎参加第二届中国游戏开发者大会
  • ------- 计算机网络基础
  • 利用阿里云 OSS 搭建私有 Docker 仓库
  • 使用parted解决大于2T的磁盘分区
  • #{}和${}的区别是什么 -- java面试
  • $.ajax()
  • (1)(1.19) TeraRanger One/EVO测距仪
  • (11)MSP430F5529 定时器B
  • (2020)Java后端开发----(面试题和笔试题)
  • (3)选择元素——(14)接触DOM元素(Accessing DOM elements)
  • (Mac上)使用Python进行matplotlib 画图时,中文显示不出来
  • (翻译)terry crowley: 写给程序员
  • (论文阅读31/100)Stacked hourglass networks for human pose estimation
  • (十三)Flask之特殊装饰器详解
  • ***测试-HTTP方法
  • .cn根服务器被攻击之后
  • .NET CLR Hosting 简介
  • .net core开源商城系统源码,支持可视化布局小程序
  • .NET Core跨平台微服务学习资源
  • .net 写了一个支持重试、熔断和超时策略的 HttpClient 实例池
  • .NET6 开发一个检查某些状态持续多长时间的类
  • .NET6使用MiniExcel根据数据源横向导出头部标题及数据
  • .NET下的多线程编程—1-线程机制概述
  • .net最好用的JSON类Newtonsoft.Json获取多级数据SelectToken
  • .pyc文件还原.py文件_Python什么情况下会生成pyc文件?
  • :O)修改linux硬件时间
  • @ComponentScan比较
  • @ConfigurationProperties注解对数据的自动封装