一、头文件概述 从这篇文章开始,我们将正式的进入到QCustomPlot的实践学习中来,首先我们先来学习下QCustomPlot的类图,如果下载了QCustomPlot源码的同学可以自己去QCustomPlot的目录下documentationqcustomplot下寻找一个名字叫做index。html的文件,将其在浏览器中打开,也是可以找到这个库的类图。如图1所示,是组成一个QCustomPlot类图的可能组成形式。一个图表(QCustomPlot):包含一个或者多个图层、一个或多个item(用于展示一些固定的元素,例如文本、线段等)、一个或者多个可以绘制的元素、一个布局一个图层(QCPLayer):包含基本的元素(QCPLayerable)一个QCPAbstractItem:包含一个或者多个位置信息一个坐标轴矩形(QCPAxisRect):包含多个坐标轴、有一个图例类(多个图例项) 图1图表组成 在一个QCustomPlot类图中最重要、用的最多的是QCPLayerable元素,几乎除了QCPLayer以外的元素都是继承于该类。QCPAbstractPlottable:绘图元素,包含:折线图(QCPGraph)、曲线图(QCPCurve)、柱状图(QCPBars)、QCPStatiBox(盒子图)、QCPColorMap(色谱图)、QCPFinancial(金融图)QCPAbstractItem:标示项,包含:直线(QCPItemStraightLine)、线段(QCPItemLine)、曲线(QCPItemCurve)、矩形(QCPItemRect)、椭圆(QCPItemEllipse)、文本(QCPItemText)、小圆球(QCPItemTracer)、图片(QCPItemPixmap)、括弧(QCPItemBracket)布局项(QCPLayoutElement):布局项(QCPAbstractLegendItem)、坐标轴矩形(QCPAxisRect)网格线(QCPGrid):每一个坐标轴对应一个网格线坐标轴(QCPAxis):一个坐标轴矩形包含四个坐标轴,上下左右四个坐标轴。 图2可以绘制元素类图二、一个简单的示例 如下代码是一个简单的蜡烛图代码,源码我是从官方网站上扒下来的,只是为了让大家有一个初步的了解,本来是英文的注释我换成了中文,然后添加了我自己个人的一些理解,运行结果如图3所示 点击领取Qt学习资料视频教程链接 1customPlotlegendsetVisible(true);23生成2种随机的蜡烛图数据,第一个是蜡烛图数据,第二个是美国线数据4intn500;5QVectordoubletime(n),value1(n),value2(n);6QDateTimestartQDateTime(QDate(2014,6,11));7start。setTimeSpec(Qt::UTC);8doublestartTimestart。toTimet();9doublebinSize360024;1天的数据10time〔0〕startT11value1〔0〕60;12value2〔0〕20;13qsrand(9);生成随机数时给指定的种子,那么生成的随机数都是相同的,因此每次运行后得到的结果都是不变的14for(inti1;i)15{16time〔i〕startTime3600i;17value1〔i〕value1〔i1〕(qrand()(double)RANDMAX0。5)10;18value2〔i〕value2〔i1〕(qrand()(double)RANDMAX0。5)3;19}2021初始化一个蜡烛图指针:22QCPFinancialcandlesticksnewQCPFinancial(customPlotxAxis,customPlotyAxis);23candlestickssetName(Candlestick);24candlestickssetChartStyle(QCPFinancial::csCandlestick);设置图表类型为蜡烛图25candlesticksdata()set(QCPFinancial::timeSeriesToOhlc(time,value1,binSize,startTime));设置数据26candlestickssetWidth(binSize0。9);设置每一个数据项的绘制宽度27candlestickssetTwoColored(true);设置是否显示两种颜色28candlestickssetBrushPositive(QColor(245,245,245));设置收开画刷29candlestickssetBrushNegative(QColor(40,40,40));设置收开画刷30candlestickssetPenPositive(QPen(QColor(0,0,0)));设置收开画笔31candlestickssetPenNegative(QPen(QColor(0,0,0)));设置收开画笔3233初始化一个美国线图指针:34QCPFinancialohlcnewQCPFinancial(customPlotxAxis,customPlotyAxis);35ohlcsetName(OHLC);36ohlcsetChartStyle(QCPFinancial::csOhlc);设置图表类型为美国线37ohlcdata()set(QCPFinancial::timeSeriesToOhlc(time,value2,binSize3。0,startTime));为了区分于蜡烛图显示,38ohlcsetWidth(binSize0。2);39ohlcsetTwoColored(true);4041创建一个坐标轴矩形42QCPAxisRectvolumeAxisRectnewQCPAxisRect(customPlot);43customPlotplotLayout()addElement(1,0,volumeAxisRect);44volumeAxisRectsetMaximumSize(QSize(QWIDGETSIZEMAX,100));45volumeAxisRectaxis(QCPAxis::atBottom)setLayer(axes);46volumeAxisRectaxis(QCPAxis::atBottom)grid()setLayer(grid);47设置自己构造的坐标轴矩形属性48customPlotplotLayout()setRowSpacing(0);49volumeAxisRectsetAutoMargins(QCP::msLeftQCP::msRightQCP::msBottom);50volumeAxisRectsetMargins(QMargins(0,0,0,0));51生成两种颜色的柱状图52customPlotsetAutoAddPlottableToLegend(false);是否自动生成图例53QCPBarsvolumePosnewQCPBars(volumeAxisRectaxis(QCPAxis::atBottom),volumeAxisRectaxis(QCPAxis::atLeft));54QCPBarsvolumeNegnewQCPBars(volumeAxisRectaxis(QCPAxis::atBottom),volumeAxisRectaxis(QCPAxis::atLeft));55for(inti0;in5;i)56{57intvqrand()20000qrand()20000qrand()20000100003;58(v0?volumeNeg:volumePos)addData(startTime36005。0i,qAbs(v));构造随机数据59}60volumePossetWidth(36004);61volumePossetPen(Qt::NoPen);62volumePossetBrush(QColor(100,180,110));63volumeNegsetWidth(36004);64volumeNegsetPen(Qt::NoPen);65volumeNegsetBrush(QColor(180,90,90));6667设置自己构造的坐标轴矩形的x轴和QCustomPlot中的坐标轴矩形(默认的会生成一个)x轴同步,两个坐标轴永远显示的坐标范围是一样的68connect(customPlotxAxis,SIGNAL(rangeChanged(QCPRange)),volumeAxisRectaxis(QCPAxis::atBottom),SLOT(setRange(QCPRange)));69connect(volumeAxisRectaxis(QCPAxis::atBottom),SIGNAL(rangeChanged(QCPRange)),customPlotxAxis,SLOT(setRange(QCPRange)));70构造一个新的坐标轴刻度计算类71QSharedPointerQCPAxisTickerDateTimedateTimeTicker(newQCPAxisTickerDateTime);72dateTimeTickersetDateTimeSpec(Qt::UTC);73dateTimeTickersetDateTimeFormat(dd。MMMM);74volumeAxisRectaxis(QCPAxis::atBottom)setTicker(dateTimeTicker);赋予自己构造的坐标轴矩形的x轴一个新的刻度计算类75volumeAxisRectaxis(QCPAxis::atBottom)setTickLabelRotation(15);76customPlotxAxissetBasePen(Qt::NoPen);77customPlotxAxissetTickLabels(false);不显示坐标轴文本78customPlotxAxissetTicks(false);不显示坐标轴(这个接口实现的不友好,后续文章我会具体说到)79customPlotxAxissetTicker(dateTimeTicker);赋予默认的坐标轴矩形的x轴一个新的刻度计算类80customPlotrescaleAxes();81customPlotxAxisscaleRange(1。025,customPlotxAxisrange()。center());82customPlotyAxisscaleRange(1。1,customPlotyAxisrange()。center());8384设置两个坐标轴矩形左右对齐85QCPMarginGroupgroupnewQCPMarginGroup(customPlot);86customPlotaxisRect()setMarginGroup(QCP::msLeftQCP::msRight,group);87volumeAxisRectsetMarginGroup(QCP::msLeftQCP::msRight,group); 图3蜡烛图运行示意图