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

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

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

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

官方提供的demo提供了4个例程,这里初入手的特别注意范例plot-examples,其包含了多种效果,修改代码的数字实现不同的demo,如果修改 setupDemo(10);如下图:是Realtime Data Demo。这个就是绘制实时数据的demo。
qcustomplot绘制实时波形图(频谱图、瀑布图)并开启opengl支持_第1张图片
qcustomplot绘制实时波形图(频谱图、瀑布图)并开启opengl支持_第2张图片
官方这个没有鼠标当前位置的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在处理的。

源码,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
  2. 在XxwCustomPlot类构造函数中开启qcustomplot的opengl。
    setOpenGl(true);
    qDebug() << openGl();

2020-6-17 更新,在上面的版本基础上,自己修改了qcustomplot源码,完美支持大量数据下的频谱图,瀑布图显示。由于公司使用的就不发源码了,如下图使用了20万个点的模拟数据,CPU占用13%左右,数据量应该还有提升空间,说下大概思路,就是重写qcustomplot的插入数据的接口,频谱图瀑布图都全部使用它内部的内存指针进行数据的批量拷贝赋值,而不像它原来的接口一个一个赋值效率太低了,数据稍微一多就非常卡。

你可能感兴趣的:(QT)