众所周知Qt 5.7过后Qt添加了官方的Chart库,终于可以用官方的库替代QWT和QCustomerPlot。本文只是简单的融合了几个Qt官方例子。程序运行图如下:

文章目录

#功能点
其实大家来看博客,就是来看有啥功能,能ctrl + C加ctrl + V到自己项目里的,至于原理,有兴趣的同学可以自己去看看Qt源码,所以这里就主要讲一下本例有什么功能:

  1. 数据动态更新。例子里是定时器,定时更新一个正弦波。
  2. 放大缩小。通过鼠标滚轮实现图像放大缩小功能。
  3. 比例复原。当你不小心把图像弄丢了,没关系,点击一下鼠标右键就行了。
  4. 坐标显示。鼠标悬停到数据线条上就会显示,XY坐标的值。
  5. 图像拖拽。不能拖拽那有啥意思?

接下来就简单讲解一下每个功能点的简单实现,基础知识我就不讲了,因为我也不知道,写代码就是一个搬运的过程。

##数据动态更新
说道数据动态更新,但凡用过QWT和QCustomerPlot的同学都知道,这样做:

QVector<QPointF> data;if (data.size() > max) {data.pop_back();data.push_front(point);
} else {data.push_front(point);
}

每次只需要把最后的数据弹出去,然后添加新的数据就OK了,但是QChart这个地方有点意思,到替换原来数据的时候,前面数据和后面数据就连一起了,一条好好的正弦波多了一条线,肯定不爽啊。然后就看了Qt的Example,在audio那,就是音频数据采集那,但凡做过AD数据采集的同学应该都懂,然后我当然就把那的代码化为己有了:

void MainWidget::updateData()
{int i;QVector<QPointF> oldData = series->pointsVector();QVector<QPointF> data;if (oldData.size() < 97) {data = series->pointsVector();} else {/* 添加之前老的数据到新的vector中,不复制最前的数据,即每次替换前面的数据* 由于这里每次只添加1个数据,所以为1,使用时根据实际情况修改*/for (i = 1; i < oldData.size(); ++i) {data.append(QPointF(i - 1 , oldData.at(i).y()));}}qint64 size = data.size();/* 这里表示插入新的数据,因为每次只插入1个,这里为i < 1,* 但为了后面方便插入多个数据,先这样写*/for(i = 0; i < 1; ++i){data.append(QPointF(i + size, 10 * sin(M_PI * count * 4 / 180)));}series->replace(data);count++;
}

清楚明了,每次都需要copy一次数据,不过这种方法效率不知道怎么样,普通的采集还好,我之前公司的项目,收数据是按us级来搞的,所以之前用QCustomerPlot效果也不太好,一次replot()就是3个ms(毕竟QCustomerPlot的底层也是copy了一次数据= =!),那我得漏多少条数据。。。

##放大缩小
这个就比较好搞,一个鼠标滚轮事件:

void MainWidget::wheelEvent(QWheelEvent *event)
{if (event->delta() > 0) {chart->zoom(1.1);} else {chart->zoom(10.0/11);}QWidget::wheelEvent(event);
}

比例自己定,这里我的是比例是10%。

##比例复原
其实就调用了一个zoomReset()函数:

void ChartView::mousePressEvent(QMouseEvent *event)
{if (event->button() & Qt::LeftButton) {isClicking = true;} else if (event->button() & Qt::RightButton) {chart()->zoomReset();}QChartView::mousePressEvent(event);
}

##坐标显示
改自官方Example的Callout,其实我就改了一下命名,因为有代码洁癖,不习惯匈牙利命名法,C++喜欢用驼峰,C语言还是K&C,然后内容没改,但愿不会被查水表,具体代码就不贴了,下面发整个工程的代码链接。

##图像拖拽
就是一个mousePressEvent和mouseMoveEvent事件,鼠标按下了把标志位变为true,然后在鼠标Move的时候检测标志位是否为true,如果是就根据坐标计算scroll值:

void ChartView::mouseMoveEvent(QMouseEvent *event)
{int x, y;if (isClicking) {if (xOld == 0 && yOld == 0) {} else {x = event->x() - xOld;y = event->y() - yOld;chart()->scroll(-x, y);}xOld = event->x();yOld = event->y();return;}QChartView::mouseMoveEvent(event);
}

代码链接:
https://github.com/DragonPang/QtChart

QtChart——简单的动态波形图相关推荐

  1. python模拟行星运动_使用 Python 来简单的动态模拟一下太阳系的运转

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 以下文章来源于Python技术 ,作者派森酱 提到太阳系,大家可能会想到哥 ...

  2. 简单的动态网站java,Java实践:一个简单的动态数组实现

    一个简单的动态数组实现 基于数组实现 添加10w的容量 在删除 所有 容量 平均是 0.4秒 这个效率是可观的 下面来一起看看代码package com.array; import java.util ...

  3. 一个简单 JDK 动态代理的实例

    动态代理的步骤: 创建一个实现了 InvocationHandler 接口的类,必须重写接口里的 invoke()方法. 创建被代理的类和接口 通过 Proxy 的静态方法 newProxyInsat ...

  4. python图表制作方法_Python中一种简单的动态图表制作方法

    在读技术博客的过程中,我们会发现那些能够把知识.成果讲透的博主很多都会做动态图表.他们的图是怎么做的?难度大吗?这篇文章就介绍了Python中一种简单的动态图表制作方法. 数据暴增的年代,数据科学家. ...

  5. Linux下最简单的动态域名用法

    Linux下最简单的动态域名用法 估计做IT的哥们象我这样ADSL包月的应该很多,我一般家里有一部电脑是24小时开机的,它上面跑着我的各种应用,也相当于我的一个网络硬盘.为了方便自己能从远程访问,我们 ...

  6. python简单心形代码爱情闪字_ps制作简单的动态闪字效果图

    动态GIF图片一直是网络图片中数量比较多的一种,也深受大众喜爱,有一些特别的酷和个性,可以用PS软件来实现一些简单的动画.下面用photoshop CS5来进行操作说明,一起来看看吧. 方法/步骤 新 ...

  7. 用p5.js编写简单的动态图形——波纹扩散

    用p5.js编写简单的动态图形--波纹扩散 第一次使用p5.js写程序,如有错误请指出,多多指教. 没有下载p5.js的小伙伴可以直接使用网页版的,简单注册一个账号之后就可以保存代码啦. 网站:htt ...

  8. RDLC报表系列(一) 简单的动态数据绑定和配置

    RDLC报表系列(一) 简单的动态数据绑定和配置 原文:RDLC报表系列(一) 简单的动态数据绑定和配置 RDLC系列链接 RDLC报表系列(一) 简单的动态数据绑定和配置  RDLC报表系列(二) ...

  9. python绘制太阳系_使用 Python 来简单的动态模拟一下太阳系的运转

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 以下文章来源于Python技术 ,作者派森酱 提到太阳系,大家可能会想到哥 ...

最新文章

  1. IIS 7.0的ASP.NET应用程序生命周期概述
  2. HTTP 错误 404.13 - Not Found 请求筛选模块被配置为拒绝超过请求内容长度的请求。(上传文件长度问题)
  3. grunt使用小记之开篇:grunt概述
  4. 阿里云服务器本地连接(windows) 阿里云服务器和本地的磁盘共享数据
  5. 小算法小心情:背包问题就是陪你看花开向阳
  6. 重装系统无法安装在efi分区_001_关于选中的磁盘具有MBR分区表。在 EFI 系统上,Windows 只能安装到 GPT 磁盘。问题解决...
  7. XSS注入,js脚本注入后台
  8. 低启动0.7V升压芯片
  9. 教育研究方法 的思维导图
  10. Vmware虚拟机桥接模式设置
  11. 命令top动态监控进程所占系统资源
  12. 【RGB手持补光棒调光照明方案】 单节双节电池LED升压恒流驱动调光芯片FP7208,PWM内部转模拟调光,无频闪顾虑低亮无抖动
  13. STM32学习心得二十六:DAC数模转换实验
  14. 第2关:求2个数的和
  15. 网易一元夺宝数据库分析(未涉及管理员)
  16. uni-app蓝牙设备连接以及设备的传输,CRC16,ios蓝牙和安卓蓝牙获取数据不一致处理方案
  17. 《哲学·科学·常识》记与思
  18. Multi-scale Interactive Network for Salient Object Detection(用于显著性目标检测的多尺度交互网络)
  19. 小学计算机游戏小狐狸历险记,小狐狸历险记文字版
  20. Wifi 的Log分析

热门文章

  1. 我们的科技创新为何离黑科技如此遥远?
  2. 批量生成不重复的虚拟卡卡号和密码
  3. Android之RemoteViews篇上————通知栏和桌面小控件
  4. csp-j 模拟题2
  5. DB2活动日志满的原因及解决与避免方案
  6. WEB前端技能考核内容及岗位要求 送给找工作的童鞋 详细概括
  7. 钉钉小程序实现富文本编辑
  8. Mirai 源码分析
  9. c语言数据结构及算法实现代码,数据结构算法实现及解析―配合严蔚敏_吴伟民编著的数据结构(C语言版和C++版)(作者 高一凡)源代码...
  10. 左移寄存器vhdl_8位移位寄存器vhdl代码