QCustomPlot開發筆記(二):QCustomPlot使用者互動、元素項以及特殊用法

21497936發表於2022-05-04

前言

  上一篇講解了,基礎繪圖,本片繼續描述使用者互動、元素項以及Qt中的一些特殊用法。

QCustomPlot使用者互動

  QCustomPlot 提供多種內建的使用者互動。它們大致可以分為:

  • 通過滑鼠拖動和滾動滑鼠滾輪進行範圍操作
  • 通過單擊選擇繪圖實體
  • 使用者點選繪圖實體時發出的訊號

範圍操作

拽託

  使用者操作軸範圍的預設方法是在相應的QCPAxisRect上執行拖動操作。
   在這裡插入圖片描述
  要在QCustomPlot小部件中啟用範圍拖動,需要將標誌 QCP::iRangeDrag新增到當前允許的互動中。這可以通過 customPlot->setInteraction(QCP::iRangeDrag, true) 完成。要僅允許在一個方向上拖動,使用QCPAxisRect::setRangeDrag並指定 Qt::VerticalQt::Horizontal。預設為兩個方向都允許 Qt::Vertical | Qt::Horizontal
  在拖動操作過程中,通過 QCPAxisRect::setRangeDragAxes配置的軸會實時更新其範圍,從而自動呼叫replots。這會給使用者一種用滑鼠抓取繪圖座標平面的印象。最初,範圍拖動軸配置為矩形的底部和左側軸。
  在拖動操作期間,通過實時更新其範圍配置的軸,自動導致重新繪製。這給使用者一種通過用滑鼠抓住繪圖座標平面來移動它的印象。最初,範圍拖動軸被配置為矩形的底部和左側軸。對於QCustomPlot小部件的預設為橫軸和縱軸,它們是 QCustomPlot::xAxisQCustomPlot::yAxis

縮放

  要更改範圍的大小,即放大或縮小繪圖,使用者可以使用滑鼠滾輪。此行為由互動標誌 QCP::iRangeZoom控制,該標誌還需要通過 QCustomPlot::setInteraction啟用。與範圍拖動一樣,縮放也可能會針對受影響的軸和方向進行選擇,請參見函式 QCPAxisRect::setRangeZoomAxesQCPAxisRect::setRangeZoom
  此外,可以使用 QCPAxisRect::setRangeZoomFactor控制縮放因子。在普通滑鼠硬體上,一個滑鼠滾輪步長對應於應用於軸範圍的該因子。如果係數大於1,則向前滾動滑鼠滾輪會減小範圍(放大),向後滾動則會增大範圍(縮小)。要反轉此行為,請將滑鼠滾輪縮放因子設定為小於1(但大於零)。縮放始終以繪圖中的當前滑鼠游標位置為中心。這意味著將游標指向感興趣的功能,滾動滑鼠滾輪可以放大該功能。

選擇機制

   在這裡插入圖片描述
   QCustomPlot提供了一種選擇機制,允許使用者潛在地選擇繪圖中的每個元件,如軸和圖形。可以使用以 QCP::iSelect(…) 開頭的互動標誌來控制特定類別的實體在繪圖中是否通常是可選擇的。例如,設定 customPlot->setInteraction(QCP::iSelectPlottables, true) 將允許使用者通過單擊來選擇繪圖表(例如圖形)。檢視 QCP::Interaction文件中的所有互動標誌。要允許同時選擇多個物件,請設定 QCP::iMultiSelect互動標誌。然後,使用者可以通過按住“多重選擇”修改器(請參見 QCustomPlot::setMultiSelectModifier)連續選擇多個物件,預設情況下,該修改器為 Ctrl

控制個體的可選擇性和選擇狀態

  通過在單個物件上使用 setSelectable函式,可以進一步微調可選擇性。例如,如果使用者無法選擇繪圖中的特定圖形,請呼叫 thatGraph->setSelectable(false)。可以通過 setSelected函式以程式設計方式修改選定狀態。即使使用者的可選擇性被禁用,也可以通過程式設計更改選擇狀態。
  要取消選擇繪圖中的所有物件,請呼叫 QCustomPlot::deselectAll

選定物件的外觀

  選定的物件通常使用不同的筆、畫筆或字型顯示。可以使用 QCPGraph::setSelectedPen、QCPGraph::setSelectedBrush、QCPAxis::setSelectedLabelFont、QCPAxis::setSelectedBasePen、QCPItemText::setSelectedColor等方法進行配置。可以看出,它們的命名與原始(非選定)屬性類似,但字首為“選定”。

多部分物件

  某些物件(如軸和圖例)的外觀更為複雜,因此僅選擇一個布林值是不夠的。在這些情況下, selectabilityselection state都是 SelectablePart標誌的or組合(相應的QFlags型別稱為SelectableParts)。每個多部件物件定義自己的SelectablePart型別。
   在這裡插入圖片描述
  例如,QCPAxis在概念上由三部分組成:帶有記號的軸主幹、記號標籤(數字)和軸標籤。由於這三個部分可以單獨選擇,QCPAxis::SelectablePart定義了 QCPAxis::spNone、QCPAxis: :spAxis、QCPAxis::spTickLabels和QCPAxis::spAxisLabel。要使軸主幹和刻度標籤可選擇,但不能選擇軸標籤,則可呼叫 theAxis->SetSelectableParts(QCPAxis::spAxis | QCP::spTickLabels)。要控制多部分物件的當前選擇狀態,請使用 QCPAxis::setSelectedParts方法。

對選擇變化做出反應

  在選擇更改後,每個物件都會發出一個名為 selectionChanged的訊號。無論更改是由使用者引起的,還是通過呼叫 setSelected/setSelectedParts以程式設計方式引起的,都無關緊要。
  如果使用者互動改變了繪圖中的選擇,則會發出QCustomPlot寬訊號 QCustomPlot::selectionChangedByUser。在與此訊號相連的插槽中,可以檢查某些物件的選擇狀態,並做出相應的反應。 QCustomPlot::selectedPlottables、selectedItems、selectedAxes和selectedLegends方法在這裡可能有助於檢索特定型別的選定物件。

使用者互動訊號

  QCustomPlot獨立於選擇機制,在使用者互動時發出各種訊號。最低階的是 QCustomPlot::mouseDoubleClick、mousePress、mouseMove、mouseRelease和mouseWheel訊號。當QCustomPlot小部件的相應事件觸發時,它們就會發出。請注意, 最乾淨的方法是將QCustomPlot子類化,並用相同的名稱重新實現事件方法(從QWidget繼承)。然而,如果不想將QCustomPlot子類化,這些訊號允許更容易地訪問簡單任務的使用者互動。
  還有更高階別的訊號報告繪圖中某些物件的單擊和雙擊: QCustomPlot::plottableClick、plottableDoubleClick、itemClick、itemDoubleClick、axisClick、axisDoubleClick、legendClick、legendDoubleClick、titleClick和titleDoubleClick。所有這些訊號都會報告單擊了哪個物件(如果是多部分物件,則報告單擊了哪個部分),以及相關的QMouseEvent。

元素項:支援的圖形元素

   QCustomPlot允許在繪圖上放置和錨定圖形元素,如文字、箭頭、線、矩形、任意畫素地圖等。它們基於抽象基類QCPAbstractItem。QCPAbstractItem的文件中詳細描述了項機制以及當前可用的內建項。

使用箭頭和文字的基本示例

  此示例顯示如何建立始終位於軸矩形頂部的文字標籤,以及將列印座標中的點與該標籤連線的箭頭。

// add the text label at the top:QCPItemText *textLabel = new QCPItemText(customPlot);textLabel->setPositionAlignment(Qt::AlignTop|Qt::AlignHCenter);textLabel->position->setType(QCPItemPosition::ptAxisRectRatio);textLabel->position->setCoords(0.5, 0); // place position at center/top of axis recttextLabel->setText("Text Item Demo");textLabel->setFont(QFont(font().family(), 16)); // make font a bit largertextLabel->setPen(QPen(Qt::black)); // show black border around text
 // add the arrow:QCPItemLine *arrow = new QCPItemLine(customPlot);arrow->start->setParentAnchor(textLabel->bottom);arrow->end->setCoords(4, 1.6); // point to (4, 1.6) in x-y-plot coordinatesarrow->setHead(QCPLineEnding::esSpikeArrow);

  請注意,即使拖動列印範圍,箭頭仍會附著在列印座標(4,1.6)上,並相應地旋轉/拉伸。這是通過QCustomPlot專案定位的靈活性實現的。專案可以在列印座標、絕對畫素座標和軸矩形大小的分數單位中定位。 QCPAbstractItemQCPItemPosition的文件更詳細地介紹瞭如何使用這些不同的可能性。
   在這裡插入圖片描述
  與繪圖表一樣,建立自己的專案也很容易。這可以通過建立自己的QCPAbstractItem子類來實現。請參閱QCPAbstractItem文件中的子類部分。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70010283/viewspace-2890659/,如需轉載,請註明出處,否則將追究法律責任。

相關文章