QCustomplot整理

来源:互联网 发布:现场工程师 linux维护 编辑:程序博客网 时间:2024/04/29 14:23

QCustomPlot 使用整理

QCustomPlot 是一个比较小的 QT 图表插件。使用时,我们在程序中写完相关调用的代码后,只需将 QCunstomPlot.cpp 和 QCustomPlot.h 两个文件加入工程,正常编译即可。看起来使用挺方便。对于简单的,效率不高的数据可视化需求,基本能满足。这里把使用该插件的一些经验做简单记录。

 

1. 插件的声明

QCustomPlot 的官方文档里,只介绍了在 QT Designer 中 prompt 插件的方法,如果是使用可视化窗口设计界面,这样就足够了。但是,如果用纯代码来设计界面,就麻烦了,针对初学者的文档里,并没有提到怎么 new 出一个 QCustomPlot 实体。

根据官方文档在图形界面中prompt 插件后,编译,查看designer生成的 ui_xxxx.h 文件,在里面发现了声明方法。下面是我自己在项目里的代码,已测试可行。

    QWidget *paintArea = new QWidget;    QCustomPlot *myPlot = new QCustomPlot(paintArea);    myPlot->setFixedSize(480,300);    //blue line    myPlot->addGraph();    myPlot->graph(0)->setPen(QPen(Qt::blue));    //xAxis    myPlot->axisRect()->setupFullAxesBox();    myPlot->xAxis->setRange(1, 1, Qt::AlignRight);    myPlot->yAxis->setRange(30, 30, Qt::AlignRight);    myPlot->xAxis->setLabel("I(A)");    myPlot->yAxis->setLabel("U(V)");

 

2. 关于 buffer

QCustomPlot 提供的几个 example 中,几乎都是用这两种给图表喂数据的方法:setData() 和 addData()。

在数据比较少,或者是设备性能比较好时,这没什么问题。但是,大数据量、有限资源时,效率真的很让人崩溃。看了 QCumstomPlot 实现这两个函数的代码。居然,都是先申请一个新的buffer,把旧的 buffer 里内容和新数据一起拷贝到新 buffer !!!而且,buffer 是用 QMap 实现的! 所以,就是我们的数据在内存里拷来拷去。

读了 API 文档,它其实提供了另一个接口,而且它在文档里推荐大家使用这个接口!!!看下面代码:

    QCPDataMap *mData = myPlot->graph(0)->data();    mData->clear();

data() 这个调用,返回了指向内部画图 buffer 的指针!然后,我们就可以在需要的时候,往 buffer 里面添加数据:

void addToDataBuffer(float x, float y){    QCPData newData;    newData.key = x;    newData.value = y;    mData->insert(x, newData);}

QCPDataMap 是使用 QMAP 结构实现的一个字典,使用 x 作为字典的 key;字典的值 QCPData 是一个自带操作方法的对象,可以看做坐标横纵坐标的组合 (x,y)。

所以,字典里添加元素,操作就是 insert 了;如果需要多个 x 对应一个 y,那就是字典的 key 可以对应多个值,可以使用 insertMulti() 往 buffer 里面添加数据。

同样的,更新完数据,我们需要 replot() 一下。还有,每次画新的曲线之前,先 clear 一下 buffer 就好。

 

3. 画图区域的背景色

不要问我为什么,我是读代码发现的:

    QBrush backRole;    backRole.setColor("skyblue");    backRole.setStyle(Qt::SolidPattern);    myPlot->setBackground(backRole);

如果不加 SolidPattern,画出来的图是透明的。

转自:http://www.cnblogs.com/pied/p/5164000.html

0 0
原创粉丝点击