一、可以实现的图
相对于其他绘制图表的第三方库来说,QCustomPlot算是比较轻量的,不仅仅能实现功能,而且二次开发比较容易。下面我们来具体说下他可以实现那些图
- QCPGraph:折线图,LineStyle枚举可以设置折线图绘制的风格,主要区别是两点间连线的方式,常规的方式就是直连,其他还有L型、Z型等,如图1所示,都是折线图,只是设置了不同的折线参数;QCPScatterStyle枚举用于设置节点类型,包括:圆形、三角形等,如图2所示。
- QCPBars:柱状图,如图3所示
- QCPFinancial:蜡烛图,主要用于展示股票k线图,如图4所示。
- 其他图表还包括:色谱图(QCPColorMap)、统计箱(QCPStatisticalBox)、参数曲线(QCPCurve),这几个图我就不单独贴图说明了,想看效果的同学可以去QCustomplot使用分享(一) 能做什么事查看。
二、效果预览
这里我在单独贴出来QCustomPlot可以实现的图表,或者点击QCustomplot使用分享(一) 能做什么事,这篇文章里有一个gif图,图中包含所有的图。
图1 折线图
图2 折线图
图3 柱状图
图4 蜡烛图
三、数据存储
因为本篇文章是基于QCustomPlot2.0.0beta版本分析,如果有同学发现和自己手头的源码有出入,首先看下源码版本是否一致,如果源码版本一致,但是和我说的有出入,欢迎指正。
一个关键的模板类QCPDataContainer,提供了一些基础的数据操作方法,例如:设置数据、新增数据、按键移除数据、清空、排序和查找等一些的方法,这个类出现的原因主要在于图和图仅仅是存储的数据类型不同,但是他们对这些数据操作时的接口基本相同,而这个类的功能就是把这些公有的接口提取出来,如果那个图表需要这样的数据存储,只需要用这个类来存储,类的模板参数指明具体的存储数据类型即可。
因为不同的表只是数据存储格式不一样,而他们对数据的接口操作已经被QCPDataContainer类抽象到一起了,比如:折线图数据存储类QCPGraphData、柱状图数据存储类QCPBarsData等,当他们使用数据存储的时候会像这样QCPDataContainer<QCPGraphData>和QCPDataContainer<QCPBarsData>来声明对象。
这个时候呢抽象还没有结束,因为所有的绘图类仅仅是提供的接口参数不一样,就像最终存储数据的结构不一样似的,比如折线图可能会像addData(QCPGraphData),柱状图可能会像addData(QCPBarsData),但是这些接口里实现的时候调用的操作完全是一样的,这个时候又出现了一个操作的抽象接口类QCPPlottableInterface1D,这个类的实现类是QCPAbstractPlottable1D,其中包含了一个QCPDataContainer指针,存储着具体的图表类型数据,他的声明可能会像下边这样
1 template <class DataType>//该类在被继承的时候初始化该参数,一般设置为图表存储的数据类型 2 class QCP_LIB_DECL QCPAbstractPlottable1D : public QCPAbstractPlottable, public QCPPlottableInterface1D 3 { 4 // No Q_OBJECT macro due to template class 5 6 public: 7 QCPAbstractPlottable1D(QCPAxis *keyAxis, QCPAxis *valueAxis); 8 virtual ~QCPAbstractPlottable1D(); 9 10 // virtual methods of 1d plottable interface: 11 virtual int dataCount() const