QT 2d绘图优化(一)
最近在用QT做一款白板软件,在开发过程中,发现了有如下几个问题
void drawLine(QPointF endpt)
{path.quadTo(path.currentPosition(),(path.currentPosition()+endpt)/2);
}
如上述代码段所示,我们给一个api传送一个点,该函数作为一个类的公共成员,支持外部调用,我们在移动鼠标的时候,可以通过鼠标移动事件来读取当前鼠标的坐标
void mouseMoveEvent(QMouseEvent *event)
{if(event->button()==Qt::leftButton){drawLine(event->pos());update();{}
然后我们通过paintEvent事件绘画这条曲线,通过update来更新这条曲线,实现动态绘制
void paintEvent(QPaintEvent*event)
{QPainter painter(this);painter.drawPath(path);
}
在未开启抗锯齿的时候,线条更新不会因为不停更新一条QPainterPath而变卡,但是开启抗锯齿后,性能开销一大,在不断更新那条QPainterPath的时候,就会变得很卡,极其影响使用
优化方法:
拆分。
拆分是在算法中一个非常常见的概念,当我们遇到一个性能开销很大的代码块,其又是必要功能的时候,我们可以尝试通过利用拆分的思想来解决问题。
一条线段绘制之所以会卡,是因为paint事件在绘画这条曲线的时候,每次都是从头开始绘制,那么必然会影响后面动态绘制的速度,开启了抗锯齿只是让变卡的过程加快了,也就是即使你不开启抗锯齿,经过一段时间的绘制,仍然会变卡顿。
QHashMap,哈希表,我们通过哈希来拆分一条线段之后的多个线段,比如,一条完整的QPainterPath,我们可以拆分成10段,100段,这就是我们俗称的,空间换时间的说法,但是在如今的算法开发中,空间换时间是很正常的事情,过去内存在几M到几十M中,自然要考虑空间要素,但是现在的个人计算机使用,小到4g大到几十g,甚至于8g和16g都非常常见,所以我们没那么大的必要去考虑这个空间上的开销。
那么说了这么多,如何去拆分呢?
//例如这是一条完整的QPainterPath
QPainterPath path;
//这是我们的哈希表
QHashMap<uint,QPainterPath>paths;
void drawLine(QPointF pt)
{QPointF prept=path.currentPositon();path.quadto(prept,(prept+pt)/2);//我们在创建了一条线段后,传入该线段的id号paths.insert(id,path);//初始化线段path&=QPainterPath((prept+pt)/2);
}
//动态更新曲线,以及绘制数据结构中的线段
void paintEvent(QPaintEvent*event)
{painter.drawPath(path);foreach(QPainterPath realPath,paths){painter.drawPath(realPath);}
}
QT 2d绘图优化(一)相关推荐
- Qt 2D绘图功能简单总结
文章目录 Qt 2D绘图功能简单总结 Qt 2D绘图功能简单总结 Qt 的绘图功能非常强大,它可以绘制一切想要的图形,从最简单的一条直线到其他任何复杂的图形,还可以用来绘制文本和图片. Qt的绘图系统 ...
- Qt 2D绘图(5):绘制图像基础
Qt 2D绘图(5):绘制图像基础 本文为原创文章,转载请注明出处,或注明转载自"黄邦勇帅(原名:黄勇) 本文出自本人原创著作<Qt5.10 GUI完全参考手册>网盘地址: ht ...
- Qt 2D绘图之二:抗锯齿渲染和坐标系统
一.抗锯齿渲染 1.1 逻辑绘图 图形基元的大小(宽度和高度)始终与其数学模型相对应,下图示意了忽略其渲染时使用的画笔的宽度的样子. 1.2 物理绘图(默认情况) 在默认的情况下,绘制会产生锯齿,并且 ...
- Qt中国象棋一—— Qt 2D 绘图入门
最近想用Qt写一个中国象棋的项目,在网上找了几个例子后,发现关于绘图部分基础为0 ,于是根据项目需要学习一下.查了一些网上的资料,在此总结一下:我比较喜欢的方式是用到什么学什么,或者自己想做一个东西, ...
- Qt学习笔记之2D绘图
一.概要 Qt中提供了强大的2D绘图系统,可以使用相同的API在屏幕和绘图设备上进行绘制,它主要基于QPainter.QPaintDevice和QPaintEngine这三个类.其中QPainter用 ...
- 【Qt】2D绘图之绘制图像(二)
00. 目录 文章目录 00. 目录 01. 概述 02. 开发环境 03. 绘制QImage图像 04. 绘制QPixmap图像 05. 绘制QPicture图像 06. 综合对比 07. 附录 0 ...
- 【Qt】2D绘图之绘制图片
00. 目录 文章目录 00. 目录 01. 概述 02. 开发环境 03. 简单绘制图片 04. 平移图片 05. 缩放图片 06. 旋转图片 07. 扭曲图片 08. 附录 01. 概述 Qt提供 ...
- 【Qt】2D绘图之绘制简单的图形
00. 目录 文章目录 00. 目录 01. 概述 02. 开发环境 03. 绘制图形 04. 画笔和画刷 05. 绘制弧线 06. 附录 01. 概述 Qt中提供了强大的2D绘图系统,可以使用同一A ...
- [Qt教程] 第15篇 2D绘图(五)绘制图片
[Qt教程] 第15篇 2D绘图(五)绘制图片 楼主 发表于 2013-5-2 17:59:00 | 查看: 886| 回复: 3 绘制图片 版权声明 该文章原创于Qter开源社区(www.qter ...
最新文章
- Python 数据库操作 psycopg2
- java dto是什么_java项目中VO和DTO以及Entity,各自是在什么情况下应用的
- JsonUtils 工具类
- 一个优秀的可定制化Flutter相册组件,看这一篇就够了
- ROS笔记(29) 启动Movelt!
- linux hal-get-property进程说明,Android HAL property_get() 函数用法
- linux下的C语言开发(静态库)
- prism v2之旅(7)
- eclipse maven 插件的安装和配置
- android 系统框架 dx
- 利用 SQL Monitor 查看语句运行状态步骤
- mysql5和8怎么同时安装_WINDOWS服务器同时安装多个版本的MYSQL的方法,MQYSQL5和MQYSQL8的共存。...
- 全网最详细的VMware虚拟机下载安装教程
- 美国主要经济指标(2)
- 使用PreListener与InteractionListener的一个小发现
- datatable 摧毁_我们快速的生活方式将使假新闻的发展摧毁我们。
- C语言——整型整除,浮点数整除
- 数学建模算法总结——03二次规划+非线性规划
- 安装Imatest出现的bug及解决方案
- Qt复现pure virtual method called报错,与解决办法