QCustomPlot的核心類就是QCustomPlot類。這個類繼承自QWidget,因此可以像其他QWidget一樣使用,比如放入布局中。
QCustomPlot類基本結構
一個QCustomPlot對象可以包含多個圖層(通過QCPLayer表示),通常使用默認圖層。
它包含四個坐標軸(上、下、左、右),默認顯示左下兩個坐標軸(xAxis和yAxis,另外兩個坐標軸是xAxis2,和yAxis2)。坐標軸的類型是QCPAxis。
可以在圖表中添加多個圖形(Plottables),比如QCPGraph(曲線圖)、QCPBars(柱狀圖)等。這些圖形都繼承自QCPAbstractPlottable。
可以添加其他元素:標題(通過plotLayout()設置)、圖例(QCPLegend)、文本標簽(QCPItemText)、直線(QCPItemLine)等。
QCustomPlot圖層
QCustomPlot類管理著所有的圖層,它默認自帶了六個圖層:
背景層:
background
網格層:
grid
繪圖層:
main
坐標軸層:
axes
圖例層:
legend
overlay層:
overlay
層的順序的不同,繪制的順序也不同,越在底下的層越早繪制,默認為繪圖層main。
每個QCustomPlot類默認包含一個繪圖區域QCPAxisRect,一個QCPAxisRect一般來說會有上軸xAxis2
、下軸xAxis
、左軸yAxis
和右軸yAxis2
四個軸。
QCustomPlot使用步驟:
將QCustomPlot加入工程。通常你可以直接包含qcustomplot.h和qcustomplot.cpp文件。
在UI設計器中,可以將一個QWidget提升為QCustomPlot,或者直接在代碼中創建。
在代碼中,通過addGraph()添加一條曲線(返回一個QCPGraph指針),然后設置數據。
設置坐標軸范圍、標簽等。
如果需要實時更新,在定時器中更新數據并調用replot()。
示例代碼(部分)
#include "qcustomplot.h"// 創建一個QCustomPlot對象(假設已經有一個QWidget容器,比如在UI設計器中放置了一個QWidget,然后提升為QCustomPlot)
QCustomPlot *customPlot = new QCustomPlot(parent);// 添加一條曲線
QCPGraph *graph = customPlot->addGraph();
graph->setData(x, y); // x和y是QVector<double>類型的數據// 設置坐標軸標簽
customPlot->xAxis->setLabel("X");
customPlot->yAxis->setLabel("Y");// 設置坐標軸范圍,可以自動調整
customPlot->rescaleAxes();// 重繪
customPlot->replot();
實時繪圖需要定時器不斷更新數據,然后重繪。可以使用addData()方法追加數據點,避免每次更新全部數據點,提升性能。
交互功能:
縮放:
customPlot->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom);
圖例可點擊,然后連接信號:
customPlot->legend->setSelectableParts(QCPLegend::spItems); // 連接信號槽。
selectionChangedByUser
自定義繪圖元素:通過QCPAbstractItem派生類可以繪制各種自定義的圖形元素(如箭頭、文本等)。
多圖層:用于組合多種圖形,比如在一個圖表中既有曲線又有柱狀圖,且柱狀圖在曲線之上顯示。
QCustomPlot核心功能亮點??
??多圖層支持??
獨立的圖層系統(
QCPLayer
),可分層繪制圖形元素(如曲線、文本、形狀)。圖層疊加順序可控,支持動態顯隱圖層。
??豐富的基礎繪圖類型??
??曲線圖??:
QCPGraph
(折線、曲線、散點圖)??柱狀圖??:
QCPBars
(分組/堆疊柱狀圖)??統計圖??:
QCPStatisticalBox
(箱線圖)、QCPColorMap
(熱力圖)??金融圖??:
QCPFinancial
(K 線圖)??極坐標圖??:
QCPPolarGraph
(雷達圖、極坐標曲線)
??軸系統與刻度??
- 雙軸系統(X/Y軸),支持多軸共存(如左右Y軸、上下X軸)。
- 自定義刻度生成器(
QCPAxisTicker
),支持對數軸、時間軸、文本標簽軸。 - 軸范圍靈活控制:自動縮放、手動固定、拖拽平移。
??交互式操作??
??平移/縮放??:支持鼠標拖拽平移、滾輪縮放(可限定方向)。
??點選/框選??:通過?
QCPSelectionRect
?實現矩形區域選擇數據點。??圖例交互??:點擊圖例隱藏/顯示關聯曲線。
??數據光標??:實時顯示數據點坐標的?
QCPItemTracer
。
??樣式高度可定制??
線條樣式:線寬、線型(實線/虛線)、顏色漸變。
填充樣式:支持漸變填充、紋理貼圖。
文本與字體:任意位置的文本標簽(
QCPItemText
)、字體屬性自定義。軸外觀:刻度長度、標簽旋轉、背景網格線密度。
QCustomPlot高級特性
實時數據刷新?
?通過?QCustomPlot::replot()
?高效重繪圖表,適合動態數據流(如傳感器數據):
// 動態追加數據示例
QVector<double> x, y;
x << 1 << 2 << 3;
y << 5 << 2 << 7;
customPlot->graph(0)->setData(x, y);
customPlot->replot(); // 刷新顯示
?數據選擇與編輯?
?啟用?setInteractions
?支持數據點選擇(單擊/框選):
customPlot->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom | QCP::iSelectPlottables);
導出功能?
?一鍵導出為矢量圖或位圖:
customPlot->savePdf("chart.pdf", 0, 0); // PDF 矢量圖
customPlot->savePng("chart.png", 800, 600); // PNG 位圖
??性能優化??
大容量數據處理(十萬級數據點)時啟用?setOpenGl(true)
?加速渲染。
通過?setAntialiasedElements
?按需啟用抗鋸齒以平衡性能與質量。
部分代碼
// 創建簡單曲線圖
QCustomPlot *plot = new QCustomPlot;
plot->addGraph(); // 添加曲線
plot->graph(0)->setData(xData, yData); // 填充數據// 坐標軸配置
plot->xAxis->setLabel("X軸");
plot->yAxis->setLabel("Y軸");
plot->xAxis->setRange(0, 10); // 固定范圍
plot->yAxis->setRange(-5, 15);// 交互設置
plot->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom);// 實時刷新定時器
QTimer *timer = new QTimer;
QObject::connect(timer, &QTimer::timeout, [&](){addNewDataPoint(); // 更新數據plot->replot();
});
timer->start(50); // 20Hz刷新
適用場景??
科學計算可視化(如 MATLAB 風格繪圖)
工業監控實時曲線
金融數據分析(K 線圖、趨勢線)
嵌入式設備數據顯示(低資源占用)
學術論文圖表生成(矢量輸出)