QCustomPlot之Item(十)
在QCustomPlot中,所有的Item都继承自QCPAbstractItem
,QCustomPlot给我们提供了一些Item
- QCPItemBracket 括号Item
- QCPItemCurve 曲线Item,其实就是贝塞尔曲线
- QCPItemEllipse 椭圆/圆Item
- QCPItemLine 线段Item
- QCPItemPixmap 图片Item
- QCPItemRect 矩形Item
- QCPItemStraightLine 直线Item
- QCPItemText 文字Item
- QCPItemTracer 追踪者Item
QCPAbstractItem
默认存在于QCustomPlot
的当前层中,默认的当前层为main
,我们可以通过setClipToAxisRect
和setClipAxisRect
设置Item裁切于某个特定的轴矩形,将setClipToAxisRect
设置为false则Item裁切于QCustomPlot
QCPItemAnchor与QCPItemPosition联系与区别
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的像素位置
以下图片空心圆为QCPItemAnchor,实心圆为QCPItemPosition
QCPItemBracket
QCPItemBracket可以看到QCPItemBracket通过
left
和right
决定其位置,而center
则用于给其它的QCPItemPosition定位用的,QCPItemBracket通过setLength
设置left
/right
到center
的垂直距离(像素)setLength设置的长度
QCPItemBracket有四种类型:
- bsSquare 中括号
- bsRound 小括号
- bsCurly 大括号
- bsCalligraphic 实体大括号
QCPItemCurve
QCPItemCurve可以看到QCPItemCurve有四个点决定其位置起点
start
和终点end
以及两个控制点startDir
、endDir
,理解QCPItemCurve的位置需要我们对贝塞尔曲线有所理解
QCPItemText
QCPItemText可以看到QCPItemText由
position
决定其位置,但是position
不一定是在文字中心的位置,我们可以通过setPositionAlignment
设置position
对齐在文字的哪一个地方,比如要对齐在topLeft
的位置:setPositionAlignment(Qt::AlignLeft)
QCPItemTracer
tracer是比较常用的一个Item,它主要用来实时跟踪QCPGraph
的某个数据点,QCPItemTracer也是用一个position
来决定其位置
QCPItemTracer有五种风格
- tsNone 不显示tracer
- tsPlus 加号
- tsCrosshair 十字线,横跨整个轴矩形
- tsCircle 圆
- tsSquare 方块
QCPItemTracer通过函数setGraph
和setGraphKey
设置要跟踪的图表以及数据点,setGraph(nullptr)
可以使QCPItemTracer得位置是任意的。QCPItemTracer的位置还跟setInterpolating
函数有关,当setInterpolating
为true时,启用线性插值,这时候QCPItemTracer的位置是精确地在我们设置的位置,并且对value
轴的值进行线性插值;为false的时候QCPItemTracer的位置是最接近于这个位置的key
值点的位置