QCustomPlot系列(6)-在圖中插入文本框/直線箭頭/圖片/矩形/橢圓/遊標等

效果圖如下:

 

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位置上即可。

 

圖形元素中的QCPItemAnchor 或QCPItemPosition類型的成員就是錨定點(見上圖),QCustomplot中的QCPAbstractItem類型的圖形元素(見下圖)都有錨定點,

文本框類QCPItemText含有4個錨點成員變量:上下左右,錨點座標就是文本框四邊的正中心。如果設置了某個QCPAbstractItem對象的錨點錨定(也可以設置只錨定X值或Y值)在文本框的某個錨點上,那麼QCPAbstractItem對象的錨點(或者X座標/Y座標)就會總是等於文本框的錨點座標。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章