QCustomplot使用分享(三) 图

QCustomPlot是一个轻量级的图表绘制库,能够实现折线图、柱状图、蜡烛图等多种图表。QCPGraph用于折线图,QCPBars用于柱状图,QCPFinancial用于蜡烛图。数据存储通过QCPDataContainer模板类进行抽象,提供统一的数据操作接口。文章提供了一个简单的折线图示例。
摘要由CSDN通过智能技术生成

一、可以实现的图

      相对于其他绘制图表的第三方库来说,QCustomPlot算是比较轻量的,不仅仅能实现功能,而且二次开发比较容易。下面我们来具体说下他可以实现那些图

  1. QCPGraph:折线图,LineStyle枚举可以设置折线图绘制的风格,主要区别是两点间连线的方式,常规的方式就是直连,其他还有L型、Z型等,如图1所示,都是折线图,只是设置了不同的折线参数;QCPScatterStyle枚举用于设置节点类型,包括:圆形、三角形等,如图2所示。
  2. QCPBars:柱状图,如图3所示
  3. QCPFinancial:蜡烛图,主要用于展示股票k线图,如图4所示。
  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
QCustomPlot 是一个强大的 C++ 库,用于创建高质量的定制表和数据分析应用程序。如果你想要利用 QCustomPlot 在后台线程绘制形,以避免阻塞用户界面,可以通过以下步骤实现: 1. **开启多线程支持**:首先,确保你在项目开启了多线程功能,这通常需要包含 `<QThread>` 和 `<QRunnable>` 头文件,并且知道如何创建并管理线程。 2. **定义绘制任务**:创建一个继承自 `QRunnable` 的类,该类将负责执行绘制操作。在该类的 `run()` 方法,你可以调用 QCustomPlot 的绘画方法(如 `plot()` 或 `updateGraph()`)。 ```cpp class DrawTask : public QRunnable { public: DrawTask(QCustomPlot *plot, const QVector<double> &data) : plot(plot), data(data) {} void run() override { plot->beginUpdates(); plot->曲线系列()->setData(data); // 其他可能的设置,比如设置样式或调整坐标轴 plot->endUpdates(); } private: QCustomPlot *plot; QVector<double> data; }; ``` 3. **在主线程启动绘制**:在主线程的上下文,创建一个新的 `DrawTask` 实例并将它放入线程池或新线程执行: ```cpp QThreadPool *threadPool = QThreadPool::globalInstance(); DrawTask *task = new DrawTask(customPlot, generateData()); threadPool->start(task); ``` 4. **处理完成通知**:如果希望在绘制完成后通知主窗口更新,可以在 `DrawTask` 类添加信号连接,或者在 `run()` 结束后直接调用 `emit finished();` 并在主窗口的槽函数里接收这个信号。 这样,当你在后台线程绘制数据时,用户界面上的其他操作不会被阻塞,提高了程序的响应性和用户体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值