QT-QcustomPlot之Item(四)

参考文章:https://segmentfault.com/a/1190000022114010

一、QCustuomPlot的分层机制
QCustomPlot的分层系统是控制图中元素渲染顺序的机制。最初,QCustomPlot有五个层:“background”、“grid”、“main”、“axes”和“legend”(按顺序)。最上面两层“轴”和“图例”包含默认轴和图例,因此它们将绘制在顶部。
QT-QcustomPlot之Item(四)
中间是“主”层。它最初为空并设置为当前层(请参见QCustomPlot::setCurrentLayer)。默认情况下,将在该图层上创建所有新的打印表、项目等。然后是“grid”层,其中包含QCPGrid实例(它们严格属于QCPAxis,请参见QCPAxis::grid)。AxisRect背景应绘制在其他所有对象的后面,因此默认的QCPAxisRect实例被放置在“背景”层上。当然,可以根据需要更改各个对象的层从属关系(QCPLayerable::setLayer)。
控制对象的顺序很容易:用QCustomPlot::addLayer在想要的位置创建一个新层,例如在“main”上面。然后使用QCustomPlot::setCurrentLayer将当前层设置为新层,最后正常创建对象。由于当前图层设置,它们将自动放置在新图层上。或者,您也可以忽略当前层设置,在创建对象之后,使用qcplayerbable::setLayer将它们移动到所需的层。

也可以移动整个层。例如,如果希望栅格显示在“main”图层上所有绘图表/项目的前面,只需使用QCustomPlot::moveLayer将其移到“main”上方。

一个层中的渲染顺序只是按创建或插入的顺序。最后创建(或最后添加到图层中)的项目将绘制在该图层上所有其他对象的顶部。

删除图层后,图层上的对象不会随之删除,而是落在已删除图层下方的图层上,请参见QCustomPlot::removeLayer。

二、QCPAbstractIte
QT-QcustomPlot之Item(四)
QCPAbstractIte是绘图中所有项的抽象基类。

在QCustomPlot中,项是补充图形元素,既不是绘图表(qcpastractplottable),也不是轴(QCPAxis)。虽然绘图仪始终绑定到两个轴上,因此也可以将项目放置在独立于任何轴的绝对坐标中。每个特定项目至少有一个控制定位的QCPItemPosition成员。有些项由多个坐标定义,因此有两个或多个QCPItemPosition成员(例如,QCPItemRect具有左上角和右下角)。

这个抽象基类定义了一个非常基本的接口,比如可见性和裁剪。因为这个类是抽象的,所以不能实例化。使用其中一个子类或自己创建一个子类来创建新项。

内置项包括:

QCPItemLine : 由起点和终点定义的线。每侧可能有不同的结尾样式(例如箭头)。

QCPItemStraightLine: 由起点和方向点定义的直线。与QCPItemLine不同,直线是无限长的,没有结尾。

QCPItemCurve: 由起点、终点和两个中间控制点定义的曲线。每侧可能有不同的结尾样式(例如箭头)。

QCPItemRect :一个长方形

QCPItemEllipse: 椭圆

QCPItemPixmap :任意像素

QCPItemText :文本标签

QCPItemBracket :一种括号,可以用来参考/突出显示绘图中的某些部分。

QCPItemTracer: 一种可以附加到QCPGraph上并在给定关键坐标的情况下粘在其数据点上的项目

QCPAbstractItem默认存在于QCustomPlot的当前层中,默认的当前层为main,我们可以通过setClipToAxisRect和setClipAxisRect设置Item裁切于某个特定的轴矩形,将setClipToAxisRect设置为false则Item裁切于QCustomPlot

QCPItemPosition继承自QCPItemAnchor,QCPItemAnchor用于给QCPItemPosition定位用的,QCPItemPosition则表示了Item的位置,一个Item可以有多个QCPItemAnchor和QCPItemPosition
我们主要理解QCPItemPosition是如何决定Item的位置的,它有四种位置类型:

ptAbsolute 按像素的方式
ptViewportRatio 按QCustomPlot可视区域的比例
ptAxisRectRatio 按其存在的轴矩形的比例(通过setAxisRect函数设置轴矩形)
ptPlotCoords 按坐标系位置(通过setAxes函数轴)
可以通过setType、setTypeX、setTypeY函数设置x、y方向的位置类型,然后通过setCoords设置其位置,setCoords是跟setType设置的类型相关的,Item的位置还跟它锚定的父锚点QCPItemAnchor相关,可以通过setParentAnchor、setParentAnchorX、setParentAnchorY函数设置x、y方向的父锚点,父锚点决定了其起点位置,当设置父锚点后,type类型会变为ptAbsolute按像素的方式~~~~

我们可以直接通过setPixelPosition设置Item的像素位置,而不用管setType的类型是什么,通过pixelPosition返回Item的像素位置
三、QCPItemTracer
QT-QcustomPlot之Item(四)