效果图如下:

python 箭头 plot plot画箭头_锚定

 

QCustomPlot已经为我们提供了文字框QCPItemText、直线(可设置带箭头)类QCPItemLine。

一、QCPItemText的基本用法:

textLabel = new QCPItemText(this);//在QCustomplot中新建文字框
textLabel->setPositionAlignment(Qt::AlignTop|Qt::AlignLeft);//文字布局:顶、左对齐
textLabel->position->setType(QCPItemPosition::ptAxisRectRatio);//位置类型(当前轴范围的比例为单位/实际坐标为单位)
textLabel->position->setCoords(0.5, 0); //把文字框放在X轴的中间,Y轴的最顶部
textLabel->setText("Text Item Demo");
textLabel->setFont(QFont(font().family(), 16)); //字体大小
textLabel->setPen(QPen(Qt::black)); //字体颜色
textLabel->setPadding(QMargins(2,2,2,2));//文字距离边框几个像素

美中不足的是,官方没有提供设置QCPItemText背景色的方法,默认背景是透明的。不过好在有源码,我们改改官方源码,使他支持设置背景色。修改步骤如下:

跳转到QCPItemText类的virtual void draw(QCPPainter *painter) Q_DECL_OVERRIDE函数里来看一下,


 


QCPItemText绘制边框、绘制文字都是在这个函数里干的,上面红色框的那一句是我自己加的,我把背景设置成了绿色(原理就是在绘制方框、文字之前,先绘制一个绿色矩形面)。知道了这一点,我们就可以添加一个private的QColor变量,然后通过public接口操作这个颜色就可以随时修改文字框的背景了。

 

二、下面再看看QCustomPlot的直线类QCPItemLine

基本用法如下:

arrow = new QCPItemLine(this);
arrow->start->setParentAnchor(textLabel->bottom);  //设置该直线的起点为文字框的下锚点  
arrow->end->setCoords(4, 1.6); //设置直线终点为坐标系中的点
arrow->setHead(QCPLineEnding::esSpikeArrow);//设置箭头类型(三角形、菱形、方形等)
arrow->setVisible(false);

较为简单,不再赘述。

 

 

三、设置跟随锚定点

setParentAnchor(QCPItemAnchor *)、
 setParentAnchorX(QCPItemAnchor *) 、
 setParentAnchorY(QCPItemAnchor *)

设置锚定点的作用是什么?

举2个例子:

(1)我们在plot中画了一个箭头,箭头的起点位于某文本框的底部中心,如本文的第一张图所示,我们希望当文本框发生移动时,箭头的起点能够总是保持在文本框的底部中心,实现这一功能,只需把箭头的起始点设置为锚定到文本框的底部锚上即可:arrow->start->setParentAnchor(textLabel->bottom);

(2)我们在plot中添加了一个游标和文本框,我们希望游标能跟随鼠标实时移动,然后文本框紧贴plot的左边沿,文本框的Y位置总是等于游标的Y位置。由于游标、文本框都继承了QCPAbstractItem,都具备锚定功能,只需把文本框的Y位置锚定在游标锚的Y位置上即可。

 

python 箭头 plot plot画箭头_python 箭头 plot_02

图形元素中的QCPItemAnchor 或QCPItemPosition类型的成员就是锚定点(见上图),QCustomplot中的QCPAbstractItem类型的图形元素(见下图)都有锚定点,

python 箭头 plot plot画箭头_python 箭头 plot_03

文本框类QCPItemText含有4个锚点成员变量:上下左右,锚点坐标就是文本框四边的正中心。如果设置了某个QCPAbstractItem对象的锚点锚定(也可以设置只锚定X值或Y值)在文本框的某个锚点上,那么QCPAbstractItem对象的锚点(或者X坐标/Y坐标)就会总是等于文本框的锚点坐标。