一、头文件概述

从这篇文章开始,我们将正式的进入到QCustomPlot的实践学习中来,首先我们先来学习下QCustomPlot的类图,如果下载了QCustomPlot源码的同学可以自己去QCustomPlot的目录下documentation/qcustomplot下寻找一个名字叫做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所示

1 customPlot->legend->setVisible(true);2

3 //生成2种随机的蜡烛图数据,第一个是蜡烛图数据,第二个是美国线数据

4 int n = 500;5 QVectortime(n), value1(n), value2(n);6 QDateTime start = QDateTime(QDate(2014, 6, 11));7 start.setTimeSpec(Qt::UTC);8 double startTime =start.toTime_t();9 double binSize = 3600*24; //1天的数据

10 time[0] =startTime;11 value1[0] = 60;12 value2[0] = 20;13 qsrand(9);//生成随机数时给指定的种子,那么生成的随机数都是相同的,因此每次运行后得到的结果都是不变的14 for (int i=1; i

21 //初始化一个蜡烛图指针:

22 QCPFinancial *candlesticks = new QCPFinancial(customPlot->xAxis, customPlot->yAxis);23 candlesticks->setName("Candlestick");24 candlesticks->setChartStyle(QCPFinancial::csCandlestick);//设置图表类型为蜡烛图25 candlesticks->data()->set(QCPFinancial::timeSeriesToOhlc(time, value1, binSize, startTime));//设置数据26 candlesticks->setWidth(binSize*0.9);//设置每一个数据项的绘制宽度27 candlesticks->setTwoColored(true);//设置是否显示两种颜色28 candlesticks->setBrushPositive(QColor(245, 245, 245));//设置收>开画刷29 candlesticks->setBrushNegative(QColor(40, 40, 40));//设置收setPenPositive(QPen(QColor(0, 0, 0)));//设置收>开画笔31 candlesticks->setPenNegative(QPen(QColor(0, 0, 0)));//设置收>开画笔32

33 //初始化一个美国线图指针:

34 QCPFinancial *ohlc = new QCPFinancial(customPlot->xAxis, customPlot->yAxis);35 ohlc->setName("OHLC");36 ohlc->setChartStyle(QCPFinancial::csOhlc);//设置图表类型为美国线37 ohlc->data()->set(QCPFinancial::timeSeriesToOhlc(time, value2, binSize/3.0, startTime)); //为了区分于蜡烛图显示,

38 ohlc->setWidth(binSize*0.2);39 ohlc->setTwoColored(true);40

41 //创建一个坐标轴矩形

42 QCPAxisRect *volumeAxisRect = newQCPAxisRect(customPlot);43 customPlot->plotLayout()->addElement(1, 0, volumeAxisRect);44 volumeAxisRect->setMaximumSize(QSize(QWIDGETSIZE_MAX, 100));45 volumeAxisRect->axis(QCPAxis::atBottom)->setLayer("axes");46 volumeAxisRect->axis(QCPAxis::atBottom)->grid()->setLayer("grid");47 //设置自己构造的坐标轴矩形属性

48 customPlot->plotLayout()->setRowSpacing(0);49 volumeAxisRect->setAutoMargins(QCP::msLeft|QCP::msRight|QCP::msBottom);50 volumeAxisRect->setMargins(QMargins(0, 0, 0, 0));51 //生成两种颜色的柱状图

52 customPlot->setAutoAddPlottableToLegend(false);//是否自动生成图例53 QCPBars *volumePos = new QCPBars(volumeAxisRect->axis(QCPAxis::atBottom), volumeAxisRect->axis(QCPAxis::atLeft));54 QCPBars *volumeNeg = new QCPBars(volumeAxisRect->axis(QCPAxis::atBottom), volumeAxisRect->axis(QCPAxis::atLeft));55 for (int i=0; iaddData(startTime+3600*5.0*i, qAbs(v)); //构造随机数据

59 }60 volumePos->setWidth(3600*4);61 volumePos->setPen(Qt::NoPen);62 volumePos->setBrush(QColor(100, 180, 110));63 volumeNeg->setWidth(3600*4);64 volumeNeg->setPen(Qt::NoPen);65 volumeNeg->setBrush(QColor(180, 90, 90));66

67 //设置自己构造的坐标轴矩形的x轴和QCustomPlot中的坐标轴矩形(默认的会生成一个)x轴同步,两个坐标轴永远显示的坐标范围是一样的

68 connect(customPlot->xAxis, SIGNAL(rangeChanged(QCPRange)), volumeAxisRect->axis(QCPAxis::atBottom), SLOT(setRange(QCPRange)));69 connect(volumeAxisRect->axis(QCPAxis::atBottom), SIGNAL(rangeChanged(QCPRange)), customPlot->xAxis, SLOT(setRange(QCPRange)));70 //构造一个新的坐标轴刻度计算类

71 QSharedPointer dateTimeTicker(newQCPAxisTickerDateTime);72 dateTimeTicker->setDateTimeSpec(Qt::UTC);73 dateTimeTicker->setDateTimeFormat("dd. MMMM");74 volumeAxisRect->axis(QCPAxis::atBottom)->setTicker(dateTimeTicker);//赋予自己构造的坐标轴矩形的x轴一个新的刻度计算类75 volumeAxisRect->axis(QCPAxis::atBottom)->setTickLabelRotation(15);76 customPlot->xAxis->setBasePen(Qt::NoPen);77 customPlot->xAxis->setTickLabels(false);//不显示坐标轴文本78 customPlot->xAxis->setTicks(false); //不显示坐标轴 (这个接口实现的不友好,后续文章我会具体说到)

79 customPlot->xAxis->setTicker(dateTimeTicker);//赋予默认的坐标轴矩形的x轴一个新的刻度计算类80 customPlot->rescaleAxes();81 customPlot->xAxis->scaleRange(1.025, customPlot->xAxis->range().center());82 customPlot->yAxis->scaleRange(1.1, customPlot->yAxis->range().center());83

84 //设置两个坐标轴矩形左右对齐

85 QCPMarginGroup *group = newQCPMarginGroup(customPlot);86 customPlot->axisRect()->setMarginGroup(QCP::msLeft|QCP::msRight, group);87 volumeAxisRect->setMarginGroup(QCP::msLeft|QCP::msRight, group);

图3 蜡烛图运行示意图

三、示例下载

关于QCustomPlot的系列讲解,我可能会分为7篇文章来分别介绍,分别是QCustomplot使用分享(二) 源码解读、QCustomplot使用分享(三) 图   折线、参数曲线、蜡烛图、柱状图、面积图、QCustomplot使用分享(四) QCPAbstractItem、QCustomplot使用分享(五) 布局、QCustomplot使用分享(六) 坐标轴  网格线和QCustomplot使用分享(七) 层。等到图层讲完之后我会放出一个最终的demo,供大家下载。。。

四、相关文章

如果您觉得文章不错,不妨给个打赏,写作不易,感谢各位的支持。您的支持是我最大的动力,谢谢!!!

很重要--转载声明

本站文章无特别说明,皆为原创,版权所有,转载时请用链接的方式,给出原文出处。同时写上原作者:朝十晚八 or Twowords

如要转载,请原文转载,如在转载时修改本文,请事先告知,谢绝在转载时通过修改本文达到有利于转载者的目的。

qcustomplot圆_QCustomplot使用分享(二) 源码解读相关推荐

  1. QCustomplot(二) 源码解读

    阅读目录 一.头文件概述 二.一个简单的示例 三.示例下载 四.相关文章 回到顶部 一.头文件概述 从这篇文章开始,我们将正式的进入到QCustomPlot的实践学习中来,首先我们先来学习下QCust ...

  2. java计算机毕业设计图片分享网站源码+系统+数据库+lw文档+mybatis+运行部署

    java计算机毕业设计图片分享网站源码+系统+数据库+lw文档+mybatis+运行部署 java计算机毕业设计图片分享网站源码+系统+数据库+lw文档+mybatis+运行部署 项目架构:B/S架构 ...

  3. java计算机毕业设计免费音乐分享平台源码+系统+mysql数据库+lw文档

    java计算机毕业设计免费音乐分享平台源码+系统+mysql数据库+lw文档 java计算机毕业设计免费音乐分享平台源码+系统+mysql数据库+lw文档 本源码技术栈: 项目架构:B/S架构 开发语 ...

  4. Alamofire源码解读系列(十二)之请求(Request)

    本篇是Alamofire中的请求抽象层的讲解 前言 在Alamofire中,围绕着Request,设计了很多额外的特性,这也恰恰表明,Request是所有请求的基础部分和发起点.这无疑给我们一个Req ...

  5. 知秋源码解读分享系列

    作为一个乐于分享的人,我希望通过一些成熟优秀的代码库,来向大家展示读源码思路以及阐述编程方面的技巧,也希望大家从中思考并得到属于自己的一套编程方法论. 半年以来,已进行72小时时长的源码解读分享视频录 ...

  6. 微信小程序分享二维码生成

    生成微信小程序分享二维码 微信小程序官方开放的二维码的接口,其中有一个是生成小程序二维码的,还有一个是圆形的小程序码,我这里就用php生成二维码. 完整代码: public function shar ...

  7. android 分享二维码图片到微信QQ(url地址字符串生成二维码图片、分享二维码图片到微信QQ)

    主要用到的功能 1.url地址字符串生成二维码图片 2.分享二维码图片到微信QQ 所需的依赖包 implementation 'com.google.zxing:core:3.0.1' 代码 1.将U ...

  8. java毕业设计旅游分享系统源码+lw文档+mybatis+系统+mysql数据库+调试

    java毕业设计旅游分享系统源码+lw文档+mybatis+系统+mysql数据库+调试 java毕业设计旅游分享系统源码+lw文档+mybatis+系统+mysql数据库+调试 本源码技术栈: 项目 ...

  9. 【 非线性回归 Logistics-Regression 模块实现与源码解读 深度学习 Pytorch笔记 B站刘二大人(5/10)】

    非线性回归 Logistics-Regression 模块实现与源码解读 深度学习 Pytorch笔记 B站刘二大人(5/10) 数学推导 什么是logistics函数 在定义上Logistic函数或 ...

最新文章

  1. HJ0427分隔输出
  2. 智源学者朱军获2020年“科学探索奖”
  3. HALCON检测字符日期
  4. hdu3622 二分+2sat
  5. Java的算法讲解以及案例!
  6. css--block formatting context
  7. python做单元测试_如何使用python做单元测试?
  8. 逼疯上海人的垃圾分类满月了:羊肉串变羊肉吕,奶茶里珍珠按颗算...
  9. [个人笔记] 关于linux的常见问题合集
  10. java编译命令是什么_java编译命令,java的编译命令是什么?
  11. SolidWorks有限元分析流程
  12. BigGAN论文解读
  13. 摄影系列:李涛ps视频教程笔记
  14. 梦洁高端化,能解决中国人的睡眠问题吗?
  15. 鸿蒙系统如何设置字体,图解鸿蒙OS独特的字体系统!
  16. html布局间距,CSS Grid布局:列和间距
  17. STM32CUBEMX开发GD32F303(12)----输出PWM及修改PWM频率与占空比
  18. spring cloud alibaba 全家桶详细整合
  19. JamesBin专属嵌入式博客导航
  20. 计蒜客NOIP模拟赛4 D2T1 鬼脚图

热门文章

  1. 江西理工大学南昌校区排名赛 B: 单身狗的数字游戏
  2. 水晶报表ActiveX打印设置
  3. dnf登录游戏自动连接服务器,游戏登录-新手引导-地下城与勇士官方网站-腾讯游戏...
  4. esp8266 AT指令以及刷固件
  5. 关于鸿蒙OS的一些看法
  6. 网站改版更换服务器seo,网站改版、更换域名、换空间如何通知百度 | 衡水SEO老刘...
  7. 研究显示每天工作超8小时得心脏病几率增加80%
  8. 最大公约数程序c语言,C语言求最大公约数(两种最简单的算法实现)
  9. webrtc发包和码率调整
  10. Ps cloud里的CRM软件到底强在何处?