Qt图形图像开发之高性能曲线图模块QCustomplot库详细使用方法与实例(支持动、静曲线图)

 更新时间:2020年03月10日 16:13:28   作者:wildPointer_  
这篇文章主要介绍了Qt图形图像开发之高性能曲线图模块QCustomplot库详细使用方法与实例(支持动、静曲线图),需要的朋友可以参考下

Qt曲线图模块QCustomPlot库介绍

QCustomPlot是一个小型的Qt画图标类,支持绘制静态曲线、动态曲线、多重坐标曲线,柱状图,蜡烛图等

前段时间用QChart模块画图,一条曲线上面放8000条数据就会卡的不行必须要换个其他的控件,后来找到了曲线图模块QCustomplot库

这个库性能非常好,画曲线图折线图柱状图动态静态,放大缩小,都很好用,10w条数据量无压力秒画出来一点也不卡

下载地址

https://www.qcustomplot.com/index.php/download

里面分为

QCustomPlot 2和QCustomPlot 1我用的2这两个有一些函数的差异

下载解压以后我们只需要qcustomplot.h和qcustomplot.cpp

注意

pro 文件里面 写入 QT+= printsupport

动态效果

QCustomplot静态曲线图生成

//他继承QWidget 所以构造里面 放控件就会画到控件上
QCustomPlot *pCustomPlot = new QCustomPlot(ui->label);
//添加一条曲线
QCPGraph* pgraph = pCustomPlot->addGraph();
//给曲线准备数据 设置数据 
  QVector<double> x(80000);
  QVector<double> y(80000);
  for(int i = 0; i<x.size();i++)
  {
    x[i] = i;
    if(i%2==0)
      y[i] = 10;
    else
      y[i] = 20;
  }
	
	//设置数据
  pCustomPlot->graph(0)->setData(x,y);
	//设置Y轴范围
  pCustomPlot->yAxis->setRange(0,30);
	//x轴名字
  pCustomPlot->xAxis->setLabel("X");
  //Y轴名字
  pCustomPlot->yAxis->setLabel("Y");
	//设置大小
  pCustomPlot->resize(ui->label->width(),ui->label->height());
	//可以进行鼠标位置 放大缩小 拖拽 放大缩小坐标系!!!功能非常强大
  pCustomPlot->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom);
	//重绘 每次改变完以后都要调用这个进行重新绘制
  pCustomPlot->replot();

运行效果如下:

时间为坐标轴的静曲线图

大致差不多 区别在于x轴改为时间

  QCustomPlot* p2 = new QCustomPlot(ui->label_2);
  QVector<double> time;
  QVector<double> y;
	//模拟几个时间 .toTime_t()是转换为 时间戳 从1970年到现在的秒数
  time<<QDateTime::fromString("2019-01-15 17:08:23","yyyy-MM-dd hh:mm:ss").toTime_t();
  time<<QDateTime::fromString("2019-01-25 17:08:23","yyyy-MM-dd hh:mm:ss").toTime_t();
  time<<QDateTime::fromString("2019-02-15 17:08:23","yyyy-MM-dd hh:mm:ss").toTime_t();
  time<<QDateTime::fromString("2019-02-25 17:08:23","yyyy-MM-dd hh:mm:ss").toTime_t();
  time<<QDateTime::fromString("2019-03-27 13:08:23","yyyy-MM-dd hh:mm:ss").toTime_t();
  y<<5<<15<<5<<15<<5;
	
	//增加一条线
  p2->addGraph();
  //设置Y轴范围
  p2->yAxis->setRange(0,20);
  
	//QCPAxisTickerDateTime 时间坐标轴 必须要用 智能指针 
  QSharedPointer<QCPAxisTickerDateTime> timer(new QCPAxisTickerDateTime);
	//设置时间格式
  timer->setDateTimeFormat("yyyy-MM-dd");
  //设置时间轴 一共几格
  //timer->setTickCount(6);
  //设置label 旋转30° 横着显示可能显示不全 
  p2->xAxis->setTickLabelRotation(30);
  // timer->setTickStepStrategy(QCPAxisTicker::tssMeetTickCount);
	//设置坐标轴
  p2->xAxis->setTicker(timer);
  p2->xAxis->setRange(time.at(0),time.at(4));
  p2->graph(0)->setData(time,y);
  p2->resize(ui->label_2->width(),ui->label_2->height());
   p2->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom);

运行效果如下:

QCustomplot动态曲线图生成

下图动态曲线是我用传感器采集的,大家可以用一些随机数据来测试

假设图像只显示10个点 第11个点将会把第一个点挤出去 就是一个vector 出栈入栈 里面一直保持10个数据

		//QVector<double> sx_vec,xAxis_vec 存放数据的容器
 	
		//m_chartPoint_counter 计数器 一直增加 来一条数据增加一下 控制x轴前进 实现动态效果
	
		//这时容器里面还没10个点 所有一直向里面存
    if(m_chartPoint_counter < 10)
    {
    	
      sx_vec.append(sx_);
      xAxis_vec.append(m_chartPoint_counter);
	
			//设置范围正好 能显示当前点				
      sx_plot->xAxis->setRange(0,xAxis_vec.at(xAxis_vec.size()-1));
     
    }
    else
    {
    	//容器数据现在是正好10个 把第一个出栈 把第11个入栈 正好还是10个数据
      sx_vec.removeFirst();
      xAxis_vec.removeFirst();
			
			//入栈
      xAxis_vec.append(m_chartPoint_counter);
      sx_vec.append(sx_);
			//设置范围正好 能显示当前点		
      sx_plot->xAxis->setRange(xAxis_vec.at(0),xAxis_vec.at(
                     xAxis_vec.size()-1));
    }
		//设置Y轴坐标系 自动缩放以正常显示所有的数据
    sx_plot->yAxis->rescale(true);
  	//设置数据
    sx_plot->graph()->setData(xAxis_vec,sx_vec);
		//重绘制
    sx_plot->replot();
	//这里必须要一直增加 如果增加到10就不增加 效果就是第10个点一直变化 不会出现动态效果
	m_chartPoint_counter++;

图像数据清空

//图像数据清空
QCPGraph* thresholdY_line;
thresholdY_line->data().data()->clear();

这里只是介绍一些基本的功能 ,一些强大的功能 在 下载的examples里有

本文主要讲解了Qt图形图像开发之高性能曲线图模块QCustomplot库详细使用方法与实例,更多关于QT开发的知识请查看下面的相关链接

相关文章

  • QML与C++交互的实现步骤

    QML与C++交互的实现步骤

    本文主要介绍了QML与C++交互的实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • 深入理解C++编程中的局部变量和全局变量

    深入理解C++编程中的局部变量和全局变量

    这篇文章主要介绍了深入理解C++编程中的局部变量和全局变量,是C++入门学习中的基础知识,需要的朋友可以参考下
    2015-09-09
  • C++中输入输出流及文件流操作总结

    C++中输入输出流及文件流操作总结

    这篇文章主要为大家总结了C++中输入输出流及文件流操作,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-10-10
  • C/C++实现7bit与8bit编码互相转换

    C/C++实现7bit与8bit编码互相转换

    这篇文章主要为大家详细介绍了如何使用C/C++实现7bit与8bit编码互相转换功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-10-10
  • c++实现跳跃表(Skip List)的方法示例

    c++实现跳跃表(Skip List)的方法示例

    跳表(skiplist)是一个非常优秀的数据结构,实现简单,插入、删除、查找的复杂度均为O(logN),下面这篇文章主要介绍了c++实现跳跃表(Skip List)的相关资料,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧。
    2017-09-09
  • VC动态生成菜单项的实现方法

    VC动态生成菜单项的实现方法

    这篇文章主要介绍了VC动态生成菜单项的实现方法,在桌面应用程序开发中常会用到的一个功能,需要的朋友可以参考下
    2014-08-08
  • C语言连接并操作Sedna XML数据库的方法

    C语言连接并操作Sedna XML数据库的方法

    这篇文章主要介绍了C语言连接并操作Sedna XML数据库的方法,实例分析了C语言操作XML文件的相关技巧,需要的朋友可以参考下
    2015-06-06
  • C语言实现简单的通讯录管理系统

    C语言实现简单的通讯录管理系统

    这篇文章主要为大家详细介绍了C语言实现通讯录管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • Qt+QListWidget实现气泡聊天界面(附源码)

    Qt+QListWidget实现气泡聊天界面(附源码)

    由于最近的项目需要,做了些相关IM的工作。所以聊天框也是必不可少的一部分。本文以QListWidget+QPainter绘制的Item做了一个Demo。该Demo只是做一个示例,感兴趣的可以了解一下
    2022-12-12
  • C语言实现扫雷游戏详解(附源码)

    C语言实现扫雷游戏详解(附源码)

    大家好,本篇文章主要讲的是C语言实现扫雷游戏详解(附源码),感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-01-01

最新评论