qcustomplot圆_QCustomplot使用分享(二) 源码解读
一、头文件概述
从这篇文章开始,我们将正式的进入到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使用分享(二) 源码解读相关推荐
- QCustomplot(二) 源码解读
阅读目录 一.头文件概述 二.一个简单的示例 三.示例下载 四.相关文章 回到顶部 一.头文件概述 从这篇文章开始,我们将正式的进入到QCustomPlot的实践学习中来,首先我们先来学习下QCust ...
- java计算机毕业设计图片分享网站源码+系统+数据库+lw文档+mybatis+运行部署
java计算机毕业设计图片分享网站源码+系统+数据库+lw文档+mybatis+运行部署 java计算机毕业设计图片分享网站源码+系统+数据库+lw文档+mybatis+运行部署 项目架构:B/S架构 ...
- java计算机毕业设计免费音乐分享平台源码+系统+mysql数据库+lw文档
java计算机毕业设计免费音乐分享平台源码+系统+mysql数据库+lw文档 java计算机毕业设计免费音乐分享平台源码+系统+mysql数据库+lw文档 本源码技术栈: 项目架构:B/S架构 开发语 ...
- Alamofire源码解读系列(十二)之请求(Request)
本篇是Alamofire中的请求抽象层的讲解 前言 在Alamofire中,围绕着Request,设计了很多额外的特性,这也恰恰表明,Request是所有请求的基础部分和发起点.这无疑给我们一个Req ...
- 知秋源码解读分享系列
作为一个乐于分享的人,我希望通过一些成熟优秀的代码库,来向大家展示读源码思路以及阐述编程方面的技巧,也希望大家从中思考并得到属于自己的一套编程方法论. 半年以来,已进行72小时时长的源码解读分享视频录 ...
- 微信小程序分享二维码生成
生成微信小程序分享二维码 微信小程序官方开放的二维码的接口,其中有一个是生成小程序二维码的,还有一个是圆形的小程序码,我这里就用php生成二维码. 完整代码: public function shar ...
- android 分享二维码图片到微信QQ(url地址字符串生成二维码图片、分享二维码图片到微信QQ)
主要用到的功能 1.url地址字符串生成二维码图片 2.分享二维码图片到微信QQ 所需的依赖包 implementation 'com.google.zxing:core:3.0.1' 代码 1.将U ...
- java毕业设计旅游分享系统源码+lw文档+mybatis+系统+mysql数据库+调试
java毕业设计旅游分享系统源码+lw文档+mybatis+系统+mysql数据库+调试 java毕业设计旅游分享系统源码+lw文档+mybatis+系统+mysql数据库+调试 本源码技术栈: 项目 ...
- 【 非线性回归 Logistics-Regression 模块实现与源码解读 深度学习 Pytorch笔记 B站刘二大人(5/10)】
非线性回归 Logistics-Regression 模块实现与源码解读 深度学习 Pytorch笔记 B站刘二大人(5/10) 数学推导 什么是logistics函数 在定义上Logistic函数或 ...
最新文章
- HJ0427分隔输出
- 智源学者朱军获2020年“科学探索奖”
- HALCON检测字符日期
- hdu3622 二分+2sat
- Java的算法讲解以及案例!
- css--block formatting context
- python做单元测试_如何使用python做单元测试?
- 逼疯上海人的垃圾分类满月了:羊肉串变羊肉吕,奶茶里珍珠按颗算...
- [个人笔记] 关于linux的常见问题合集
- java编译命令是什么_java编译命令,java的编译命令是什么?
- SolidWorks有限元分析流程
- BigGAN论文解读
- 摄影系列:李涛ps视频教程笔记
- 梦洁高端化,能解决中国人的睡眠问题吗?
- 鸿蒙系统如何设置字体,图解鸿蒙OS独特的字体系统!
- html布局间距,CSS Grid布局:列和间距
- STM32CUBEMX开发GD32F303(12)----输出PWM及修改PWM频率与占空比
- spring cloud alibaba 全家桶详细整合
- JamesBin专属嵌入式博客导航
- 计蒜客NOIP模拟赛4 D2T1 鬼脚图
热门文章
- 江西理工大学南昌校区排名赛 B: 单身狗的数字游戏
- 水晶报表ActiveX打印设置
- dnf登录游戏自动连接服务器,游戏登录-新手引导-地下城与勇士官方网站-腾讯游戏...
- esp8266 AT指令以及刷固件
- 关于鸿蒙OS的一些看法
- 网站改版更换服务器seo,网站改版、更换域名、换空间如何通知百度 | 衡水SEO老刘...
- 研究显示每天工作超8小时得心脏病几率增加80%
- 最大公约数程序c语言,C语言求最大公约数(两种最简单的算法实现)
- webrtc发包和码率调整
- Ps cloud里的CRM软件到底强在何处?