QCustomPlot之Item的移动和缩放(十二)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了QCustomPlot之Item的移动和缩放(十二)相关的知识,希望对你有一定的参考价值。

参考技术A 首先看一下效果图

Item移动的主要思想是改变Item下所有QCPItemPosition的位置来达到移动的目的

如下所示:我们改变item的所有QCPItemPosition的位置

与移动稍微不同的是,缩放只是移动一个QCPItemPosition的位置就可以了,不过为了让缩放点可视化,我们在缩放点位置新增了一个QCPSizeHandle,QCPSizeHandle是一个自定义的Item,如果你还不会自定义Item,请看上篇 QCustomPlot之鼠标悬浮显示值(十一)

如下所示:我们将QCPSizeHandle锚定在Item的QCPItemPosition上,这样我们可以不必关心QCPSizeHandle的位置,它总是跟随QCPItemPosition移动

同时为了绘制QCPSizeHandle之间的连线,我们让QCPSizeHandleManager继承自QCPLayerable,它需要重载 applyDefaultAntialiasingHint 和 draw 函数

QCustomPlot之Item(十)

参考技术A

在QCustomPlot中,所有的Item都继承自 QCPAbstractItem ,QCustomPlot给我们提供了一些Item

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

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

可以通过 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有四种类型:

tracer是比较常用的一个Item,它主要用来实时跟踪 QCPGraph 的某个数据点,QCPItemTracer也是用一个 position 来决定其位置

QCPItemTracer有五种风格

QCPItemTracer通过函数 setGraph 和 setGraphKey 设置要跟踪的图表以及数据点, setGraph(nullptr) 可以使QCPItemTracer得位置是任意的。QCPItemTracer的位置还跟 setInterpolating 函数有关,当 setInterpolating 为true时,启用线性插值,这时候QCPItemTracer的位置是精确地在我们设置的位置,并且对 value 轴的值进行线性插值;为false的时候QCPItemTracer的位置是最接近于这个位置的 key 值点的位置

以上是关于QCustomPlot之Item的移动和缩放(十二)的主要内容,如果未能解决你的问题,请参考以下文章

Qt的QChartView实现缩放和放大功能

QCustomPlot之层和布局(四)

Qt 之 QCustomPlot(图形库)

QCustomPlot 在绘图调整大小期间出现错误

Blender网格编辑工具之移动,旋转,缩放

四十二移动端web开发之响应式布局