最近在用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绘图优化(一)相关推荐

  1. Qt 2D绘图功能简单总结

    文章目录 Qt 2D绘图功能简单总结 Qt 2D绘图功能简单总结 Qt 的绘图功能非常强大,它可以绘制一切想要的图形,从最简单的一条直线到其他任何复杂的图形,还可以用来绘制文本和图片. Qt的绘图系统 ...

  2. Qt 2D绘图(5):绘制图像基础

    Qt 2D绘图(5):绘制图像基础 本文为原创文章,转载请注明出处,或注明转载自"黄邦勇帅(原名:黄勇) 本文出自本人原创著作<Qt5.10 GUI完全参考手册>网盘地址: ht ...

  3. Qt 2D绘图之二:抗锯齿渲染和坐标系统

    一.抗锯齿渲染 1.1 逻辑绘图 图形基元的大小(宽度和高度)始终与其数学模型相对应,下图示意了忽略其渲染时使用的画笔的宽度的样子. 1.2 物理绘图(默认情况) 在默认的情况下,绘制会产生锯齿,并且 ...

  4. Qt中国象棋一—— Qt 2D 绘图入门

    最近想用Qt写一个中国象棋的项目,在网上找了几个例子后,发现关于绘图部分基础为0 ,于是根据项目需要学习一下.查了一些网上的资料,在此总结一下:我比较喜欢的方式是用到什么学什么,或者自己想做一个东西, ...

  5. Qt学习笔记之2D绘图

    一.概要 Qt中提供了强大的2D绘图系统,可以使用相同的API在屏幕和绘图设备上进行绘制,它主要基于QPainter.QPaintDevice和QPaintEngine这三个类.其中QPainter用 ...

  6. 【Qt】2D绘图之绘制图像(二)

    00. 目录 文章目录 00. 目录 01. 概述 02. 开发环境 03. 绘制QImage图像 04. 绘制QPixmap图像 05. 绘制QPicture图像 06. 综合对比 07. 附录 0 ...

  7. 【Qt】2D绘图之绘制图片

    00. 目录 文章目录 00. 目录 01. 概述 02. 开发环境 03. 简单绘制图片 04. 平移图片 05. 缩放图片 06. 旋转图片 07. 扭曲图片 08. 附录 01. 概述 Qt提供 ...

  8. 【Qt】2D绘图之绘制简单的图形

    00. 目录 文章目录 00. 目录 01. 概述 02. 开发环境 03. 绘制图形 04. 画笔和画刷 05. 绘制弧线 06. 附录 01. 概述 Qt中提供了强大的2D绘图系统,可以使用同一A ...

  9. [Qt教程] 第15篇 2D绘图(五)绘制图片

    [Qt教程] 第15篇 2D绘图(五)绘制图片 楼主  发表于 2013-5-2 17:59:00 | 查看: 886| 回复: 3 绘制图片 版权声明 该文章原创于Qter开源社区(www.qter ...

最新文章

  1. Python 数据库操作 psycopg2
  2. java dto是什么_java项目中VO和DTO以及Entity,各自是在什么情况下应用的
  3. JsonUtils 工具类
  4. 一个优秀的可定制化Flutter相册组件,看这一篇就够了
  5. ROS笔记(29) 启动Movelt!
  6. linux hal-get-property进程说明,Android HAL property_get() 函数用法
  7. linux下的C语言开发(静态库)
  8. prism v2之旅(7)
  9. eclipse maven 插件的安装和配置
  10. android 系统框架 dx
  11. 利用 SQL Monitor 查看语句运行状态步骤
  12. mysql5和8怎么同时安装_WINDOWS服务器同时安装多个版本的MYSQL的方法,MQYSQL5和MQYSQL8的共存。...
  13. 全网最详细的VMware虚拟机下载安装教程
  14. 美国主要经济指标(2)
  15. 使用PreListener与InteractionListener的一个小发现
  16. datatable 摧毁_我们快速的生活方式将使假新闻的发展摧毁我们。
  17. C语言——整型整除,浮点数整除
  18. 数学建模算法总结——03二次规划+非线性规划
  19. 安装Imatest出现的bug及解决方案
  20. Qt复现pure virtual method called报错,与解决办法

热门文章

  1. 如何推动产业园区高质发展
  2. 20220516_ISA
  3. stress linux 下压力测试工具
  4. 在DirectX 12中使用SSAO
  5. 谈谈区块链入门技能(三):Layer 2区块链浏览器如何使用?Tokenview
  6. 快速排序原理和实现(图文讲解)
  7. python实现栈及栈在四则运算中的应用
  8. 如何在ppt中带走自己的字体
  9. matlab中求绝对值的函数图像,ex的图像(绝对值的函数图像口诀)
  10. 数组指针,指针数组例子解析