0、說明
本節翻譯總結自:Qt Plotting Widget QCustomPlot - User Interactions
本節內容是使用QCustomPlot實現繪圖和用戶交互功能。
本文代碼中的變量customPlot是QCustomPlot類型的指針,實際使用時,應當用ui->customPlot,表示UI界面中用於繪圖的QCustomPlot。
QCustomPlot提供了多種內置的用戶交互方法,這些方法可以分類歸納如下:
- 范圍調整:通過鼠標拖拽或者鼠標滾輪實現;
- 選擇要素:通過鼠標點擊;
- 點擊實例時發送信號。
1、范圍調整
默認情況下,用戶調整坐標軸范圍的方法是在分別在對應的QCPAxisRect上進行拖拽。
為了實現在QCustomPlot上實現范圍拖拽,需要在當前允許的交互上增加Flag QCP::iRangeDrag。這一點可以通過customPlot -> setInteraction( QCP::iRangeDrag , true)做到。如果想要只允許在一個方向上拖拽,可以用QCPAxisRect::setRangeDrag並且制定參數為Qt::Vertical或Qt::Horizontal。如果想允許在所有方向上拖拽(當然這也是默認的),可以用 Qt::Vertical | Qt::Horizontal 作為參數。
在拖拽過程中,通過QCPAxisRect::setRangeDragAxes設置的軸將會實時更新其范圍;這將會給用戶通過抓取坐標平面來實現移動坐標系的感覺。默認的QCustomPlot的軸是QCustomPlot::xAxis和QCustomPlot::yAxis。
以上只是改變了范圍的區間,如果我們想改變范圍的大小,例如縮放圖像,用戶可能會用鼠標滾輪。該行為是通過Flag QCP::iRangeZoom控制的,當然它也需要用QCustomPlot::setInteraction來激活。和拖拽類似,對於縮放的軸和方向也是可以選擇的,具體可以看函數QCPAxisRect::setRangeZoomAxes 和 QCPAxisRect::setRangeZoom。除此之外,縮放因子(滾動一次滾輪時縮放倍數)由QCPAxisRect::setRangeZoomFactor決定。
2、選擇要素
2.1、某一類要素的選擇
QCustomPlot提供了要素選擇的機制,允許用戶選擇畫布上的任意要素,例如坐標軸和圖像。
某一類要素是否可以選中,是通過在setInteraction方法中設置Flag QCP::iSelect(...)來實現的。例如,通過設置customPlot -> setInteraction( QCP::iSelectPlottables , true )就允許用戶通過點擊的方法來選中Plottable(比如圖像)。通過參考文檔QCP::Interaction可以獲取全部交互Flag。
如果想要同時選中多個要素,可以設置交互Flag QCP::iMultiSelect。這樣用戶就可以拖過按CTRL鍵,依次選中多個要素。(這個鍵位可以通過QCustomPlot::setMultiSelectModifier修改)。
被選中的要素會用加粗的藍色線條繪制。
2.2、控制單個要素的選擇
對某個具體對象的可選屬性,可以用setSelectable方法進行調整。例如,如果我們不想某個圖像被用戶選擇,可以用方法thatGraph->setSelectable(false)。
要素的選擇狀態可以用setSelected函數進行調整,這樣的話,即使某個要素是無法選中的(通過上一段的方法),我們依然可以通過該方法來在程序中通過上述方法修改它的狀態為選中的。
如果要取消對於畫板上所有要素的選擇,可以用QCustomPlot::deselectAll。
2.3、被選擇要素的外觀
一個被選中的要素通常會用和它原來繪制方式不同的畫筆、刷子、字體來顯示。這一點可以通過方法QCPGraph::setSelectedPen, QCPGraph::setSelectedBrush, QCPAxis::setSelectedLabelFont, QCPAxis::setSelectedBasePen, QCPItemText::setSelectedColor
來進行修改。至於這些方法的含義,可以很容易從它們的名字中看出來。
這些方法,和一開始繪制要素時的方法名十分相似,就是加了前綴"Selected"。
2.4、要素的多個組成部分
一些要素(比如坐標軸、圖例)可能有多個組成部分,這時如果我們只用一個boolean參數來表示選擇狀態就不太合適了。這種情況下,不管是可選擇性還是選中狀態,都應當是SelectablePart的Flag的一組 or組合,也就是說,不同的組分要分別通過它們各自的QFlag的組合(通過or連接)來說明。
每個多組分的要素都需要定義一個它自己的SelectablePart。
例如,QCPAxis通常是由三部分組成的——刻度線、刻度數字、軸標簽(如下)。

因此這三部分都需要各自指明它們的可選擇性,QCPAxis::SelectablePart定義了QCPAxis::spNone、QCPAxis::spAxis、QCPAxis::spTickLabels和QCPAxis::spAxisLabel。如果想要刻度線和刻度數字可選,但是軸標簽不可選,可以用theAxis->setSelectableParts(QCPAxis::spAxis|QCP::spTickLabels)。
如果想控制當前的多組分選擇狀態,可以用QCPAxis::setSelectedParts方法。
2.5、對要素選中狀態的響應
每當選中要素改變時,每個要素都會發送一個信號selectionChanged。不管這個改變是由於用戶自主選擇引起的還是程序中通過調用方法setSelected/setSelectedParts引起的。
如果是由於用戶交互引起的改變,會發送QCustomPlot::selectionChangedByUser信號。在該信號的槽函數中,我們可以檢查特定要素的選中狀態並對其做出反應。如果要檢查某種特定類型的選中,可以用方法QCustomPlot::selectedPlottables、selectedItems、selectedAxes和selectedLegends。
3、用戶交互信號
用戶交互信號與選擇機制是相互獨立的,QCustomPlot會基於用戶的操作發送多重信號。最低級的信號是QCustomPlot::mouseDoubleClick、mousePress、mouseMove、mouseRelease和mouseWheel信號,這些信號的發送時機,可以從它們的名字中看出來。
也有一些高級的信號,它們表示在具體對象上發生的事件——QCustomPlot::plottableClick、plottableDoubleClick、itemClick、itemDoubleClick、axisClick、axisDoubleClick、legendClick、legendDoubleClick、titleClick和titleDoubleClick。
所有這些信號都表示了具體哪個要素被點擊了,正如和QMouseEvent相關的事件那樣。
案例Package中包含了一個使用多方面用戶交互系統的例子(這里不再說明),它也告訴了我們如何改進交互系統以更好滿足我們需求的方法。
