QCustomPlot使用手册(一)(二)

https://blog.csdn.net/llq108/article/details/45603047

https://blog.csdn.net/llq108/article/details/45622285

介绍 

QCustomPlot 是一个基于Qt的画图和数据可视化C++控件。QCustomPlot 致力于提供美观的界面,高质量的2D画图、图画和图表,同时为实时数据可视化应用提供良好的解决方案。 

类相关

继承

获取

下载地址:http://qcustomplot.com/index.php/downloadQCustomPlot.tar.gz,目前更新到1.3.1版本。

官网:http://qcustomplot.com/index.php/introduction

论坛:http://qcustomplot.com/index.php/support/forum

使用

在你的应用中使用QCustomPlot 有2种方法:

1、将下载下来的qcustomplot.h和qcustomplot.cpp加入你的工程中。在你要使用qcustomplot的文件中:

#include "qcustomplot.h"
  
   
   

然后像使用QWidget那样使用就行,因为QCustomPlot也是继承自QWidget的:

QCustomplot *myqcp = new QCustomPlot;
  
   
   

使用Qt Designer的话,在一个QWidget控件右键,提升为...,


然后在弹出的对话框中,在提升为类名那里输入QCustomPlot,然后头文件那里会自动填充为qcustomplot.h。单击添加按钮将QCustomPlot加入提升类列表中,最后单击提升就可以了。


注意:提升之后不会立即看到什么变化,但当你运行程序的时候,你就能看到控件具有坐标和网格了。

2、不用包含 qcustomplot.h和 qcustomplot.cpp,只需引入qcustomplot.so (GNU/Linux)或qcustomplot.dll(MSWindows) file。接下来说明如何编译qcustomplot库:

首先,从下载地址下载QCustomPlot-sharedlib,然后拷贝qcustomplot.h和qcustomplot.cpp到与qcustomplot-sharedlib同级的目录下,然后在命令行模式进入sharedlib-compilation目录,运行qmake;mingw32-make;稍等片刻就会产生俩个文件夹debug和release,里面分别有qcustomplot库的debug和release版本,windows是.dll,linux是.a(而官网说的是.so,有点出入?)然后怎么使用qcustomplot很简单,我就不说了- -

注意:如果你使用的Qt版本在5.0以上,需要在.pro文件中的QT变量加上printsupport,

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets printsupport
  
   
   
这是因为Qt老版本不支持widgets和printsupport。

在QtCreator中使用帮助

在第二步下载的documentation文件夹下有个qcustomplot.qch文件,将它拷贝某个目录下,例如QtCreator的安装目录下,然后在QtCreator ,工具,选项,帮助,文档,添加,选择qcustomplot.qch文件,确定,以后按F1就能跳转到QCustomPlot的帮助文档了。

效果


好了,第一篇,主要介绍QCustomPlot和它的搭建。

一、基本画图

首先,给个简单的例子:


  
   
   
  1. // 生成数据,画出的是抛物线
  2. QVector<double> x(101), y(101); // initialize with entries 0..100
  3. for ( int i= 0; i< 101; ++i)
  4. {
  5.   x[i] = i/ 50.0 - 1; // x goes from -1 to 1
  6.   y[i] = x[i]*x[i]; // let's plot a quadratic function
  7. }
  8. // 添加数据曲线(一个图像可以有多个数据曲线)
  9. customPlot->addGraph();

  
   
   
  1. // graph(0);可以获取某个数据曲线(按添加先后排序)
  2. // setData();为数据曲线关联数据
  3. customPlot->graph( 0)->setData(x, y);
  4. // 为坐标轴添加标签
  5. customPlot->xAxis->setLabel( "x");
  6. customPlot->yAxis->setLabel( "y");
  7. // 设置坐标轴的范围,以看到所有数据
  8. customPlot->xAxis->setRange( -1, 1);
  9. customPlot->yAxis->setRange( 0, 1);

  
   
   
  1. // 重画图像
  2. customPlot->replot();

上面代码生成的结果大致是这样的:



外观
  
   
   
QCustomPlot的外观由很多方面特性组成,都可以改变:
  
   
   
坐标轴:
  
   
   
QCustomPlot有四个QCPAxis成员变量,分别代表四个坐标轴:xAxis(下)yAxis(左)xAxis2(上)yAxis2(右)
  
   
   
QCPAxis有相应的函数可以设置坐标轴的刻度、间距、范围等:
  
   
   

  
   
   
  1. setTickStep( double step); //设置刻度间距
  2. setTickVector( const QVector< double> &vec); //将坐标轴刻度设置为vec
  3. setAutoTickStep( bool on); //设置是否自动分配刻度间距
  4. setAutoTicks( bool on); //设置是否自动分配刻度
  5. setAutoTickCount( int approximateCount); //设置是否自动分配刻度数量
还有setBasePen、setTickPen、setTickLength、setSubTickLength、setSubTickPen、setTickLabelFont、setLabelFont、setTickLabelPadding、setLabelPadding、setRangeReversed等

  
   
   
等后面专门讲QCPAxis的时候再详细介绍
  
   
   

曲线风格:

QCPGraph::setPen(const QPen &pen);
  
   
   
 
  

曲线画笔:

QCPGraph::setLineStyle(LineStyle ls);
  
   
   
 
  
 
  

可以设置颜色、宽度、实虚等

曲线形状:

QCPGraph::setScatterStyle(QCPScatterStyle &style);
  
   
   

曲线形状像*、+、x、o等等

填充曲线方式:

QCPGraph::setBrush(const QBrush &brush);
  
   
   
QCPGraph::setChannelFillGraph(otherGraph);//设置与某之间曲线填充
  
   
   
QCPGraph::setBrush(Qt::NoBrush);//移除填充

  
   
   

 以上会等到专门将QCPGraph和QCPScatterStyle类的时候再细讲网格: 
  

customPlot->yAxis->grid();
  
   
   
setPen、setZeroLinePen、setSubGridVisible等
  
   
   
等讲QCPGrid类再细讲
  
   
   

二、高级画图

1、多曲线与多风格
  
   
   

  
   
   
  1. <pre name= "code" class= "cpp">customPlot->setLocale(QLocale(QLocale::English, QLocale::UnitedKingdom)); // period as decimal separator and comma as thousand separator
  2. customPlot->legend->setVisible( true);
  3. QFont legendFont = font();  // start out with MainWindow's font..
  4. legendFont.setPointSize( 9); // and make a bit smaller for legend
  5. customPlot->legend->setFont(legendFont);
  6. customPlot->legend->setBrush(QBrush(QColor( 255, 255, 255, 230)));
  7. // by default, the legend is in the inset layout of the main axis rect. So this is how we access it to change legend placement:
  8. customPlot->axisRect()->insetLayout()->setInsetAlignment( 0, Qt::AlignBottom|Qt::AlignRight);
  9.  
  10. // setup for graph 0: key axis left, value axis bottom
  11. // will contain left maxwell-like function
  12. customPlot->addGraph(customPlot->yAxis, customPlot->xAxis);
  13. customPlot->graph( 0)->setPen(QPen(QColor( 255, 100, 0)));
  14. customPlot->graph( 0)->setBrush(QBrush(QPixmap( "./dali.png"))); // fill with texture of specified png-image
  15. customPlot->graph( 0)->setLineStyle(QCPGraph::lsLine);
  16. customPlot->graph( 0)->setScatterStyle(QCPScatterStyle(QCPScatterStyle::ssDisc, 5));
  17. customPlot->graph( 0)->setName( "Left maxwell function");
  18.  
  19. // setup for graph 1: key axis bottom, value axis left (those are the default axes)
  20. // will contain bottom maxwell-like function
  21. customPlot->addGraph();
  22. customPlot->graph( 1)->setPen(QPen(Qt::red));
  23. customPlot->graph( 1)->setBrush(QBrush(QPixmap( "./dali.png"))); // same fill as we used for graph 0
  24. customPlot->graph( 1)->setLineStyle(QCPGraph::lsStepCenter);
  25. customPlot->graph( 1)->setScatterStyle(QCPScatterStyle(QCPScatterStyle::ssCircle, Qt::red, Qt::white, 7));
  26. customPlot->graph( 1)->setErrorType(QCPGraph::etValue);
  27. customPlot->graph( 1)->setName( "Bottom maxwell function");
  28.  
  29. // setup for graph 2: key axis top, value axis right
  30. // will contain high frequency sine with low frequency beating:
  31. customPlot->addGraph(customPlot->xAxis2, customPlot->yAxis2);
  32. customPlot->graph( 2)->setPen(QPen(Qt::blue));
  33. customPlot->graph( 2)->setName( "High frequency sine");
  34.  
  35. // setup for graph 3: same axes as graph 2
  36. // will contain low frequency beating envelope of graph 2
  37. customPlot->addGraph(customPlot->xAxis2, customPlot->yAxis2);
  38. QPen blueDotPen;
  39. blueDotPen.setColor(QColor( 30, 40, 255, 150));
  40. blueDotPen.setStyle(Qt::DotLine);
  41. blueDotPen.setWidthF( 4);
  42. customPlot->graph( 3)->setPen(blueDotPen);
  43. customPlot->graph( 3)->setName( "Sine envelope");
  44.  
  45. // setup for graph 4: key axis right, value axis top
  46. // will contain parabolically distributed data points with some random perturbance
  47. customPlot->addGraph(customPlot->yAxis2, customPlot->xAxis2);
  48. customPlot->graph( 4)->setPen(QColor( 50, 50, 50, 255));
  49. customPlot->graph( 4)->setLineStyle(QCPGraph::lsNone);
  50. customPlot->graph( 4)->setScatterStyle(QCPScatterStyle(QCPScatterStyle::ssCircle, 4));
  51. customPlot->graph( 4)->setName( "Some random data around\na quadratic function");
  52.  
  53. // generate data, just playing with numbers, not much to learn here:
  54. QVector<double> x0(25), y0(25);
  55. QVector<double> x1(15), y1(15), y1err(15);
  56. QVector<double> x2(250), y2(250);
  57. QVector<double> x3(250), y3(250);
  58. QVector<double> x4(250), y4(250);
  59. for ( int i= 0; i< 25; ++i) // data for graph 0
  60. {
  61.   x0[i] = 3*i/ 25.0;
  62.   y0[i] = exp(-x0[i]*x0[i]* 0.8)*(x0[i]*x0[i]+x0[i]);
  63. }
  64. for ( int i= 0; i< 15; ++i) // data for graph 1
  65. {
  66.   x1[i] = 3*i/ 15.0;;
  67.   y1[i] = exp(-x1[i]*x1[i])*(x1[i]*x1[i])* 2.6;
  68.   y1err[i] = y1[i]* 0.25;
  69. }
  70. for ( int i= 0; i< 250; ++i) // data for graphs 2, 3 and 4
  71. {
  72.   x2[i] = i/ 250.0* 3*M_PI;
  73.   x3[i] = x2[i];
  74.   x4[i] = i/ 250.0* 100 -50;
  75.   y2[i] = sin(x2[i]* 12)* cos(x2[i])* 10;
  76.   y3[i] = cos(x3[i])* 10;
  77.   y4[i] = 0.01*x4[i]*x4[i] + 1.5*(rand()/( double)RAND_MAX -0.5) + 1.5*M_PI;
  78. }
  79.  
  80. // pass data points to graphs:
  81. customPlot->graph( 0)->setData(x0, y0);
  82. customPlot->graph( 1)->setDataValueError(x1, y1, y1err);
  83. customPlot->graph( 2)->setData(x2, y2);
  84. customPlot->graph( 3)->setData(x3, y3);
  85. customPlot->graph( 4)->setData(x4, y4);
  86. // activate top and right axes, which are invisible by default:
  87. customPlot->xAxis2->setVisible( true);
  88. customPlot->yAxis2->setVisible( true);
  89. // set ranges appropriate to show data:
  90. customPlot->xAxis->setRange( 0, 2.7);
  91. customPlot->yAxis->setRange( 0, 2.6);
  92. customPlot->xAxis2->setRange( 0, 3.0*M_PI);
  93. customPlot->yAxis2->setRange( -70, 35);
  94. // set pi ticks on top axis:
  95. QVector< double> piTicks;
  96. QVector<QString> piLabels;
  97. piTicks << 0  << 0.5*M_PI << M_PI << 1.5*M_PI << 2*M_PI << 2.5*M_PI << 3*M_PI;
  98. piLabels << "0" << QString::fromUtf8( "½π") << QString::fromUtf8( "π") << QString::fromUtf8( "1½π") << QString::fromUtf8( "2π") << QString::fromUtf8( "2½π") << QString::fromUtf8( "3π");
  99. customPlot->xAxis2->setAutoTicks( false);
  100. customPlot->xAxis2->setAutoTickLabels( false);
  101. customPlot->xAxis2->setTickVector(piTicks);
  102. customPlot->xAxis2->setTickVectorLabels(piLabels);
  103. // add title layout element:
  104. customPlot->plotLayout()->insertRow( 0);
  105. customPlot->plotLayout()->addElement( 0, 0, new QCPPlotTitle(customPlot, "Way too many graphs in one plot"));
  106. // set labels:
  107. customPlot->xAxis->setLabel( "Bottom axis with outward ticks");
  108. customPlot->yAxis->setLabel( "Left axis label");
  109. customPlot->xAxis2->setLabel( "Top axis label");
  110. customPlot->yAxis2->setLabel( "Right axis label");
  111. // make ticks on bottom axis go outward:
  112. customPlot->xAxis->setTickLength( 0, 5);
  113. customPlot->xAxis->setSubTickLength( 0, 3);
  114. // make ticks on right axis go inward and outward:
  115. customPlot->yAxis2->setTickLength( 3, 3);
  116. customPlot->yAxis2->setSubTickLength( 1, 1);

 效果图: 
  

2、日期和时间数据曲线


  
   
   
  1. // set locale to english, so we get english month names:
  2.   customPlot->setLocale(QLocale(QLocale::English, QLocale::UnitedKingdom));
  3.    // seconds of current time, we'll use it as starting point in time for data:
  4.    double now = QDateTime::currentDateTime().toTime_t();
  5.   srand( 8); // set the random seed, so we always get the same random data
  6.    // create multiple graphs:
  7.    for ( int gi= 0; gi< 5; ++gi)
  8.   {
  9.     customPlot->addGraph();
  10.     QPen pen;
  11.     pen.setColor(QColor( 0, 0, 255, 200));
  12.     customPlot->graph()->setLineStyle(QCPGraph::lsLine);
  13.     customPlot->graph()->setPen(pen);
  14.     customPlot->graph()->setBrush(QBrush(QColor( 255/ 4.0*gi, 160, 50, 150)));
  15.      // generate random walk data:
  16.      QVector<double> time(250), value(250);
  17.      for ( int i= 0; i< 250; ++i)
  18.     {
  19.       time[i] = now + 24* 3600*i;
  20.        if (i == 0)
  21.         value[i] = (i/ 50.0+ 1)*(rand()/( double)RAND_MAX -0.5);
  22.        else
  23.         value[i] = fabs(value[i -1])*( 1+ 0.02/ 4.0*( 4-gi)) + (i/ 50.0+ 1)*(rand()/( double)RAND_MAX -0.5);
  24.     }
  25.     customPlot->graph()->setData(time, value);
  26.   }
  27.    // configure bottom axis to show date and time instead of number:
  28.   customPlot->xAxis->setTickLabelType(QCPAxis::ltDateTime);
  29.   customPlot->xAxis->setDateTimeFormat( "MMMM\nyyyy");
  30.    // set a more compact font size for bottom and left axis tick labels:
  31.   customPlot->xAxis->setTickLabelFont(QFont(QFont().family(), 8));
  32.   customPlot->yAxis->setTickLabelFont(QFont(QFont().family(), 8));
  33.    // set a fixed tick-step to one tick per month:
  34.   customPlot->xAxis->setAutoTickStep( false);
  35.   customPlot->xAxis->setTickStep( 2628000); // one month in seconds
  36.   customPlot->xAxis->setSubTickCount( 3);
  37.    // apply manual tick and tick label for left axis:
  38.   customPlot->yAxis->setAutoTicks( false);
  39.   customPlot->yAxis->setAutoTickLabels( false);
  40.   customPlot->yAxis->setTickVector(QVector< double>() << 5 << 55);
  41.   customPlot->yAxis->setTickVectorLabels(QVector<QString>() << "Not so\nhigh" << "Very\nhigh");
  42.    // set axis labels:
  43.   customPlot->xAxis->setLabel( "Date");
  44.   customPlot->yAxis->setLabel( "Random wobbly lines value");
  45.    // make top and right axes visible but without ticks and labels:
  46.   customPlot->xAxis2->setVisible( true);
  47.   customPlot->yAxis2->setVisible( true);
  48.   customPlot->xAxis2->setTicks( false);
  49.   customPlot->yAxis2->setTicks( false);
  50.   customPlot->xAxis2->setTickLabels( false);
  51.   customPlot->yAxis2->setTickLabels( false);
  52.    // set axis ranges to show all data:
  53.   customPlot->xAxis->setRange(now, now+ 24* 3600* 249);
  54.   customPlot->yAxis->setRange( 0, 60);
  55.    // show legend:
  56.   customPlot->legend->setVisible( true);

效果图:


三、曲线、柱形图、统计图...

到目前为止,我们为图像添加曲线都是使用


  
   
   
  1. QCustomPlot::addGraph();
  2. QCustomPlot::graph();
其实,除了 QCPGraph ,QCustomPlot 还提供了多个画图类:

QCPCurve:与QCPGraph 类似,差别在于它是用于展示参数化曲线,可以有循环。

QCPBars:柱形图,如果有多个QCPBars ,可以依次重叠。

QCPStatisticalBox、QCPColorMap、QCPFinancial
与QCPGraph 不同的是,这些画图类在添加到QCustomPlot 的时候需要使用new创建一个实例,而不能直接

<span style="color: rgb(53, 53, 53); font-family: monospace; line-height: 19.5px; background-color: rgb(240, 240, 240);">addPlottable</span>();
  
   
   

简单例子如下:


  
   
   
  1. QCPBars *myBars = new QCPBars(customPlot->xAxis, customPlot->yAxis);
  2. customPlot->addPlottable(myBars);
  3. // now we can modify properties of myBars:
  4. myBars->setName( "Bars Series 1");
  5. QVector< double> keyData;
  6. QVector< double> valueData;
  7. keyData << 1 << 2 << 3;
  8. valueData << 2 << 4 << 8;
  9. myBars->setData(keyData, valueData);
  10. customPlot->rescaleAxes();
  11. customPlot->replot();
好吧,这篇就到这里。水平有限,如有出错,敬请指出,互相学习。





猜你喜欢

转载自blog.csdn.net/m0_48990191/article/details/114971538