在学完各种dll的调用方式和QAbstractItemModel之后,终于到了这一步,之前用过CustomPlot来实现简单图的绘制,但是这次我需要从头开始,理解内涵
文章目录
- 1 Main Page
- 1.1 QCustomPlot 2.0.1 Documentation
- 1.2 Plottables 绘图板
- 1.3 Controlling the Axes 坐标轴的操控
- 1.4 Plot Legend 绘制图例
- User Interaction 用户交互
- 1.5 Decorations and Auxiliary Items 声明和辅助项目
- 1.6 Layout Elements and Layouts 布局元素和布局
- 1.7 OpenGL Accelerated Ploting and Performance Improvement OpenGL加速和性能提升
- 1.8 Preprocessor Define Flags 预处理定义
- 1.9 Using QCustomPlot with special Qt flags 使用带有特殊的Qt flag的 QCustomPlot
- 2 介绍核心类 QCustomPlot Class
1 Main Page
1.1 QCustomPlot 2.0.1 Documentation
如果你是QCustomPlot的新手,并且你准备开始使用它,我们建议你在官网中看看先关的教程和范例。
此文档尤其适合当做参考文档,当你学会了QCustomPlot的基本可视化的语法以后,并且希望学习更多的特殊的功能和更先进的概念,可以看看 class overview 章节的看QCustomPlot库中的重要的类
1.2 Plottables 绘图板
Plottables 是用来显示 QCustomPlot 中任意的数据的类,他们都从类 QCPAbstractPlottable 中所派生出来,QCPGraph 是一个 plottable,可以显示用不同的方式,比如线型,散点型,填充型的图像。
因为绘制图像是很重要的情况, QCustomPlot 有一个为 QCPGraph plottables 工作的特殊的接口,这让我们很简单的操作他们:
一个新的图像可以通过 QCustomPlot::addGraph 来创建,然后可以通过 QCustomPlot::graph 来访问。
对于其他的 plottables,普通的 plottable 的接口是如下使用的,首先,创造各自 plottables 的实例,然后添加到 QCustomPlot 中,如下所示
QCPCurve *newCurve = new QCPCurve(customPlot->xAxis, customPlot->yAxis);
新创建的 plottable 的特性可以通过 newCurve 点来访问。
Plottables(包括graphs)可以通过 QCustomPlot::plottable 来检索,因为这个函数的返回值是所有plottables的纯虚基类,QCPAbsrtactPlottable,你可能希望使用 qobject)cast 来返回指向各自的绘图板(以下用绘图板来代表plottable)的子类的指针,通常来说,如果绘图板不是指定的子类的话,cast将返回zero。
所有绘图板的接口(比如如何设置数据)都指定成绘图板类型,详细的可以看子类的文档,QCPGraph,QCPCurve,QCPBars,QCPStatisticalBox,QCPColorMap,QCPFinancial。
1.3 Controlling the Axes 坐标轴的操控
QCustomPlot 有4个默认的坐标轴,分别是,xAxis(下方),yAxis(左方),xAxis2(上方)和yAxis2(右方)。
他们的范围是由简单的类 QCPRange 来控制的,这个类基本保持了上下轴的相同的坐标,你可以使用函数 QCPAxis::setRange 来设置范围,为了将坐标轴的缩放类型从线性缩放改为对数缩放,可以设置 QCPAxis::setScaleType 为 QCPAxis::stLogarithmic,在这种情况下,您还需要对数间隔的刻度和刻度标签,因此设置坐标轴标签从 QCPAxis::setTicker 到 QCPAxisTickerLog 实例。
每一个坐标轴可以通过函数 QCPAxis::setLabel 来设定坐标轴标签比如,“Voltage(mV)”
默认情况下,会自动的创建坐标轴,并且坐标轴标签会用智能的方式存在,细微调节的话,看 QCPAxis 文档的更多的方法,标签可以通过 QCPAxis::setTicks 来禁用,如果你仅仅希望隐藏刻度标签(数据),使用 QCPAxis::setTickLabels 需要注意的是,默认的右边和上边的左边轴一开始是隐藏刻度标签的。
坐标轴主轴到绘图窗体的距离我们叫边缘,边缘是自动计算的,需要填充左边轴和刻度线,为了改变这种情况,设置 QCPAxisRect::setAutoMargins 来排斥各自的边界,并且手动设置边界,通过 QCPAxisRect::setMargins,主要的坐标轴矩形可以通过 QCustomPlot::axisRect() 来访问,详细的关于 边界/填充/偏移(margins/paddings/offset) 的解释在 QCPAxisRect 和 QCPAxis 文档中说明
1.4 Plot Legend 绘制图例
每一个 QCustomPlot 默认情况下都有一个 QCPLegend(作为QCustomPlot::legend),图例是一个小的布局单元,放置在绘图区域中,它列出了一个绘图板的线性或图标,还有绘图板的名称(通过QCPAbstractPlottable::setName 来设定)。绘图板可以通过函数 QCPAbstractPlottable::addToLegend 和 QCPAbstratPlottable::removeFromLegend 来添加或者移除图例。默认情况下,在往 QCustomPlot 中添加绘图板的时候,默认已经添加了图例,这个特性可以通过属性 QCustomPlot::setAutoAddPlottableToLegend 来改变。
QCPLegend 提供了一个接口来访问,添加,和移除图例的直接的方式。请看 QCPLegend::item,QCPLegend::itemWithPlottable, QCPLegend::addItem,QCPLegend::removeItem 的例子
多重图例通过布局系统来提供支持,因为 QCPLegend 是一个普通的布局单元
User Interaction 用户交互
QCustomPlot 支持通过鼠标来拖拽坐标轴的范围(QCPAxisRect::setRangeDrag),通过鼠标滚轮来缩放坐标轴的范围(QCPAxisRect::setRangeZoom)和一个完整的选择机制,可以通过数据点的位置和范围来配置。
这些可用的交互方式由 QCustomPlot::setInteractions 来控制,详细的交互方式,请看文档,数据选择的细节在专门的 Data Selection Mechanism 页面
除此之外,QCustomPlot 通常会发射下面的信号,当对象被单击或双击后,请看 QCustomPlot::plottableClick,QCustomPlot::plottableDoubleClick,和 QCustomPlot::axisClick 的例子
最后,最低级的控制 QCPLayerable 的鼠标的事件的虚函数,可以自己去创造子类,QCustomPlot 的实例调用受影响的分层
1.5 Decorations and Auxiliary Items 声明和辅助项目
除了绘图板之外,有另外一个绘制的对象是很重要的:Item(下面用项目来代替item),所有的项目的基类是 QCPAbstractItem,项目和绘图板分开,这样的话项目就不依赖任何的坐标轴,这意味着项目可以放置在像素的绝对位置或者矩形区域的相对位置。除此之外,项目通常不直接显示数据,而是扮演着装饰,强调和描述等作用。
多个项目可以被排列成父子关系用于动态的表现行为,打个比方,你可以配置一个箭头固定在绘图的坐标上。通常这种方式用来指示绘图中重要的区域,同时箭头的尾端可以固定在一个刻度线的中上方,取决于用户把坐标轴放在什么地方,这样箭头就会拉伸和旋转,所以它总是从标签指向指定的绘图坐标,而不需要任何其他的代码。
更多的介绍,请看 QCPAbstractItem 文档,以及各个项目的标准文档,来找出如何使用他们。
1.6 Layout Elements and Layouts 布局元素和布局
QCustomPlot 使用内部的布局系统提供动态的尺寸和位置的变化,比如轴矩形,图例,颜色缩放,和其他的布局单元,他们都是基于 QCPLayoutElement 并且都将他们放置在一个 QCPLayout 的子类中进行安排,像 QCPLayoutGrid。
详细的请看 layout system
1.7 OpenGL Accelerated Ploting and Performance Improvement OpenGL加速和性能提升
QCustomPlots 有多重的OpenGL后端支持来提升OpenGL硬件加速绘制,支持所有的Qt版本,如果电脑支持OpenGL,你可以通过代码 QCUSTOMPLOT_USE_OPENGL 并且简单的调用 setOpenGl(true) 在各自的 QCustomPlot 实例中,更多的细节请看此主题的文档。
关于最大化提升绘制的效率在文档页面 Plot Performance Improvement 中提及。
1.8 Preprocessor Define Flags 预处理定义
QCustomPlot 解析一些预处理的定义,有助于debug和编译,这些定义必须定义在包含的 QCustomPlot 头文件之前,通常来说最好的方式是添加在qmake中:DEFINES += QCUSTOMPLOT_USE_OPENGL
- QCUSTOMPLOT_USE_OPENGL:如果定义了这个,QCustomPlot 可以使用 OpenGL 来提升图像的绘制性能,看 QCustomPlot::setOpenGl
- QCUSTOMPLOT_COMPILE_LIBRARY:当需要将QCustomPlot定义为共享库的时候需要添加此宏
- QCUSTOMPLOT_USE_LIBRARY:在包含 QCustomPlot 的头文件的之前定义此宏,当使用 QCustomPlot 作为动态库来使用的时候
- QCUSTOMPLOT_CHECK_DATA:如果定义了此宏,QCustomPlot 的绘图板将会在每一次的图像重绘的时候验证数据,他将会输出qDubug的输出,编码数据的。
1.9 Using QCustomPlot with special Qt flags 使用带有特殊的Qt flag的 QCustomPlot
See the page Special Qt Flags if your project uses QT_NO_CAST_FROM_ASCII, QT_NO_CAST_TO_ASCII or QT_NO_KEYWORDS.
2 介绍核心类 QCustomPlot Class
本类是本库的核心类,这是一个QWidget,可以显示一个图像还支持和用户互动
继承 QWidget
2.1 Public Types
本类中有两个枚举
- enum LayerInsertMode:定义了层次相对另外一个层次是如何插入的
- enum RefreshPriority:定义了在重绘后什么时候QCustomPlot的表面刷新被刷新
LayerInsertMode
枚举名称 | 枚举含义 |
---|---|
limBelow | 层次在其他层次下方插入 |
limAbove | 层次在其他层次上方插入 |
RefreshPriority
枚举名称 | 枚举含义 |
---|---|
rplmmediateRefresh | 在重绘图后通过调用QWidget::repaint()函数来立刻重绘图表和窗体 |
rpQueuedRefresh | 在重绘后通过调用QWidget::update()函数来立刻重绘图表,单对窗体的重绘进行排队。这种方式可以降低多个冗余的窗体的重绘 |
rpRefreshHint | 使用即时刷新或者队列刷新取决于是否设置了 QCP::phImmediateRefresh 是否设置,看 setPlottingHints |
rpQueuedReplot | 为下一个事件循环迭代排队整个重绘工作,这种方式下,可以避免多个冗余的重绘,实际的重绘取决于 rpRefreshHint 优先级 |
2.2 Public Functions
QCustomPlot(QWidget *parent = 0)
QRect viewport() const
double bufferDevicePixelRatio() const
QPixmap background() const
bool backgroundScaled() const
Qt::AspectRatioMode backgroundScaledMode() const
QCPLayoutGrid* plotLayout() const
QCP::AntialiasedElements antialiasedElements() const
QCP::AntialiasedElements notAntialiasedElements() const
bool autoAddPlottableToLegend() const
const QCP::Interactions interactions() const
int selectionTolerance() const
bool noAntialiasingOnDrag() const
QCP::PlottingHints plottingHints() const
Qt::KeyboardModifier multiSelectModifier() const
QCP::SelectionRectMode selectionRectMode() const
QCPSelectionRect* selectionRect() const
bool openGl() const
void setViewport(const QRect &rect)
void setBufferDevicePixelRatio(double ratio)
void setBackground(const QPixmap &pm)
来源:CSDN
作者:赵树成
链接:https://blog.csdn.net/qq_18260845/article/details/104195147