qcustomplot绘制实时波形图(频谱图、瀑布图、星座图)并开启opengl支持

先简单介绍一下,绘制实时数据波形图,我们一般使用到的库有qwt、qcustomplot以及官方的QtCharts模块。

  1. qwt这个库安装比较麻烦。不过功能比较全使用的人比较多。
  2. qcustomplot很精简小巧,就一个.h .cpp文件,但是功能也很强大健全。
  3. QtCharts这个模块以前是收费使用的,现在已经免费了,官方出品。

今天的主角是qcustomplot,使用的是最新的版本:
下载地址:https://www.qcustomplot.com/

开发版QCustomPlot-dev-2.1.0:
尚未发布还在开发中,主要解决了Qt14/15的兼容问题,增加了C++11的支持,以及修复了一些bug,但是代码里面版本号作者还没改,估计发布的时候才会改,所以里面版本号还是2.0.1,开发版肯定不太稳定bug较多,examples目录下例子自己修改后可直接编译运行。建议新手或者项目使用的还是到上面官网下载2.0.1最新发布版本。
下载地址:https://download.csdn.net/download/qing666888/12752057

官方提供的demo提供了4个例程,这里初入手的特别注意范例plot-examples,其包含了多种效果,修改代码的数字实现不同的demo,如果修改 setupDemo(10);如下图:是Realtime Data Demo。这个就是绘制实时数据的demo。
在这里插入图片描述
在这里插入图片描述
官方这个没有鼠标当前位置的x/y值,有人封装了一个XCustomPlot类。添加了对鼠标当前位置信息的显示。然后自己在此基础上再次修改了一下,。自己对工程进行简单修改后,修改模拟数据点为20万个点一次刷新,刷新时间16ms。看上去还是很流畅的,我们看到没有开启opengl支持的情况下,cpu使用25%左右。当然显示的屏幕越大,cpu占用率稍微高一点会。
在这里插入图片描述
qcustomplot支持opengl绘制,然后我们开启qcustomplot的opengl。不过需要开启QT的opengl模块,同时需要安装glut库,由于GLUT的作者已经很久没更新了(最后更新于2001年!)所以其他人另外做了一个接口兼容GLUT的freeglut库,开源而且一直在维护中。freeglut是glut的超集,支持glut所有的api,跨平台(MS-Win,Linux,Mac OS均支持),并且有长期维护,十分可靠。所以我们继续修改代码让其支持opengl能够利用显卡加速的功能。需要支持opengl需要进行如下修改:

  1. 在.pro 文件中添加 QT += opengl 模块支持。
  2. 添加qt中freeglut库的支持,根据自己是使用msvc还是mingw选择不同的配置方式。本文的测试demo使用的是MinGW的配置,具体步骤见我的另一篇文章: https://blog.csdn.net/qing666888/article/details/78946384
  3. 完成上述配置后,在工程代码中XxwCustomPlot构造函数中,调用setOpenGl(true);开启qcustomplot的opengl模式。下面qDebug是打印当前qcustomplot模式是不是opengl模式。显示true则表示是opengl模式。
    setOpenGl(true);
    qDebug() << openGl();

开启后我们再看一下效果,可以看到GPU引擎已经开启,同时使用率为20%左右,而上面没开启之前则任务栏GPU列无任何显示:CPU使用率已经下降到20%左右。应为我的模拟数据是使用CPU在处理的。
在这里插入图片描述
2020-1-17 上述图源码,opengl库可能要根据自己的库路径配置一下:
https://download.csdn.net/download/qing666888/12288640

2020-5-9 更新一下开启opengl大概步骤说明

  1. 把freeglut库文件丢到工程项目目录下。.pro文件中增加如下依赖配置。
#qcustomplot使用opengl的宏定义
DEFINES += QCUSTOMPLOT_USE_OPENGL

#依赖freeglut库以及头文件
INCLUDEPATH += $$PWD/freeglut/include
LIBS += -L$$PWD/freeglut/lib/x64  -lfreeglut
  1. 在main.cpp文件中添加依赖#include <GL/freeglut.h>。
  2. 在XxwCustomPlot类构造函数中开启qcustomplot的opengl。
    setOpenGl(true);
    qDebug() << openGl();

2020-6-17 更新,下面效果由于公司项目使用的就不发源码了,开发优化思路在评论区,可根据思路自行开发,都是基于上面的版本基础上,自己修改了一点点qcustomplot源码,完美支持大量数据下的频谱图,瀑布图显示。如下图使用了20万个点的模拟数据,CPU占用13%左右,数据量应该还有提升空间,大概思路,就是重写qcustomplot的插入数据的接口,频谱图瀑布图都全部使用它内部的内存指针进行数据的批量拷贝赋值,而不像它原来的接口一个一个赋值效率太低了,数据稍微一多就非常卡。
在这里插入图片描述
2020-8-18 更新,使用qcustomplot控件完成了下面所有控件的开发。以下所有控件都是基于qcustomplot。由于gif图限制5M大小,只能节省空间缩小窗口录了。功能不能一一演示。主要包括了框选放大,波形图柱状图切换显示、框选指定范围测量出范围的频率范围以及时间范围、柱状图色柱动态修改等。主要有瀑布图(支持动态调整色柱配色范围)、频谱图(柱状图模式下支持每个频点柱状颜色设置)、星座图、IQ时域图、相位时域图、幅度时域图、信号识别(柱状图),以上图的数据都是基于信号IQ数据计算得来。所有的图都是基于qcustomplot子类化实现。里面修改了qcustomplot一些细节代码。
在这里插入图片描述
在这里插入图片描述

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页