QCustomPlot 是一個基于 Qt 的 C++ 繪圖庫,專注于高效、美觀的 2D 數據可視化。進入QCustomPlot下載頁,下載最新的完整包(包含:源碼、文檔、示例)。
一、核心架構設計
1. 分層架構模型
層級 | 主要組件 | 職責說明 |
---|---|---|
用戶接口層 | QCustomPlot 類 | 提供頂層API,管理所有子組件 |
邏輯控制層 | 坐標軸系統、圖例管理器、布局系統 | 處理業務邏輯和交互控制 |
數據管理層 | QCPDataContainer 及其派生類 | 高效存儲和檢索繪圖數據 |
渲染繪制層 | QCPPainter、OpenGL后端 | 執行實際繪圖操作 |
交互處理層 | 鼠標/鍵盤事件處理器、選擇系統 | 處理用戶交互行為 |
2. 模塊依賴關系
3.完整渲染流程
二、核心類介紹
1.核心類關系圖
2.核心類方法詳解
1). QCustomPlot(主控件)
關系:
-
包含多個
QCPLayer
(圖層) -
管理
QCPLayoutElement
(布局元素) -
持有
QCPAbstractPlottable
(可繪圖對象)
關鍵方法:
// 圖形管理
QCPGraph* addGraph(QCPAxis* keyAxis, QCPAxis* valueAxis);
void removePlottable(QCPAbstractPlottable* plottable);// 坐標軸訪問
QCPAxis* xAxis, *yAxis; // 主坐標軸
QCPAxis* axis(QCPAxis::AxisType type);// 重繪控制
void replot(QCustomPlot::RefreshPriority priority = rpRefreshHint);
2). QCPAbstractPlottable(繪圖基類)
子類:折線圖(QCPGraph)、曲線圖(QCPCurve)、柱狀圖(QCPBars)、QCPStatiBox(盒子圖)、QCPColorMap(色譜圖)、QCPFinancial(金融圖)。
核心方法:
// 數據綁定
virtual void setData(QSharedPointer<QCPDataContainer> data);// 視覺樣式
void setPen(const QPen& pen);
void setBrush(const QBrush& brush);// 坐標軸關聯
void setKeyAxis(QCPAxis* axis);
void setValueAxis(QCPAxis* axis);
3). QCPGraph(折線圖)
擴展方法:
// 線型設置
void setLineStyle(QCPGraph::LineStyle ls); // lsLine, lsStepLeft, lsNone等// 散點樣式
void setScatterStyle(const QCPScatterStyle& style);// 數據填充
void addData(const QVector<double>& keys, const QVector<double>& values);
void data()->removeBefore(double key); // 刪除指定范圍前的數據
不同于Graph,其他的Plottable需要用new進行構造,而不是用addCurve、addBars等函數創建。已經存在的Plottable可以通過 QCustomPlot ::plottable(int index)訪問,plottable的數量可以用 QCustomPlot::plottableCount訪問。
ui->widget1->xAxis->setLabel("x");ui->widget1->yAxis->setLabel("y");ui->widget1->xAxis->setRange(0,10);ui->widget1->yAxis->setRange(0,10);QCPBars *myBars = new QCPBars(ui->widget1->xAxis, ui->widget1->yAxis);// now we can modify properties of myBars:myBars->setName("Bars Series 1");QVector<double> keyData;QVector<double> valueData;keyData << 1 << 2 << 3;valueData << 2 << 4 << 8;myBars->setData(keyData, valueData);ui->widget1->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom | QCP::iSelectPlottables);ui->widget1->replot();
4). QCPAxis(坐標軸)
關聯類:
-
QCPGrid
(網格) -
QCPAxisTicker
(刻度生成器)
關鍵方法:
// 范圍控制
void setRange(double lower, double upper);
void setRange(const QCPRange& range);// 刻度配置
void setTicker(QSharedPointer<QCPAxisTicker> ticker); // 時間/對數/文本刻度
void setTickLabels(bool show);// 標簽設置
void setLabel(const QString& text);
void setLabelFont(const QFont& font);
5). QCPLayoutElement(布局元素)
子類:
-
QCPAxisRect
(坐標軸矩形) -
QCPLayoutGrid
(網格布局) -
QCPLegend
(圖例)
核心方法:
// 尺寸控制
void setMinimumSize(const QSize& size);
void setMaximumSize(const QSize& size);// 邊距設置
void setMargins(const QMargins& margins);
6. QCPAbstractItem(自定義圖元)
子類示例:
-
QCPItemText
(文本標簽) -
QCPItemLine
(參考線) -
QCPItemRect
(矩形框)
通用方法:
// 位置錨點
QCPItemPosition* position(const QString& name); // 例如 "start", "end"// 樣式設置
void setPen(const QPen& pen);
void setBrush(const QBrush& brush);
7.QCPLayer圖層
管理圖層元素(QCPLayerable),所有可顯示的對象都是繼承自圖層元素。
QCustomPlot 內置了一套默認圖層系統,用于組織不同類型的繪圖元素。理解這些默認圖層對于有效控制繪圖順序和元素管理非常重要。
默認圖層層次結構(從底到頂)
-
background - 最底層,適合放置背景元素
-
grid - 網格線層
-
main - 主圖層,大多數plottables的默認層
-
axes - 坐標軸層
-
legend - 圖例層
-
overlay - 最頂層,適合放置覆蓋元素
各默認圖層的典型內容
圖層名稱 | 包含元素 | 默認模式 |
---|---|---|
background | 背景矩形、背景圖片等 | lmLogical |
grid | 網格線 | lmLogical |
main | 圖形(QCPGraph)、柱狀圖(QCPBars)等 | lmLogical |
axes | 坐標軸、軸標簽、刻度 | lmBuffered |
legend | 圖例及其項 | lmBuffered |
overlay | 頂層標注、浮動元素 | lmLogical |
訪問和操作默認圖層
// 獲取特定默認圖層
QCPLayer *gridLayer = customPlot->layer("grid");
QCPLayer *mainLayer = customPlot->layer("main");// 檢查圖層是否存在
if (customPlot->hasLayer("legend")) {qDebug() << "存在legend圖層";
}// 獲取所有圖層列表
QList<QCPLayer*> allLayers = customPlot->layers();// 獲取圖層在堆疊順序中的索引
int layerIndex = customPlot->layerToIndex(mainLayer);
默認圖層的重要特性
-
自動創建:當創建QCustomPlot實例時,所有默認圖層會自動創建
-
繪制順序:圖層的繪制順序由QCustomPlot::mLayers列表決定,索引0最先繪制
-
默認分配:
QCPGraph *graph = customPlot->addGraph(); // 自動添加到"main"層 QCPItemText *text = new QCPItemText(customPlot); // 自動添加到"overlay"層
-
模式設置:
-
lmLogical
:直接繪制,無緩沖 -
lmBuffered
:離屏緩沖后繪制(適合復雜靜態內容)
-
三、QCustomPlot 基礎入門
1. 安裝與配置
源碼集成
-
下載最新版 QCustomPlot 官網
-
將
qcustomplot.h
和qcustomplot.cpp
添加到項目 -
在
.pro
文件中添加:QT += printsupport widgets SOURCES += qcustomplot.cpp HEADERS += qcustomplot.h
2. 基本繪圖流程
1)初始化
QCustomPlot *customPlot = new QCustomPlot(parent);
customPlot->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom);
2)?數據圖形繪制
添加圖形對象并綁定數據:
customPlot->addGraph();
QVector<double> xData = {1,2,3}, yData = {10,20,15};
customPlot->graph(0)->setData(xData, yData); // 數據綁定?
4)?坐標軸配置
設置坐標軸范圍和標簽:
customPlot->xAxis->setLabel("時間(秒)");
customPlot->yAxis->setLabel("溫度(℃)");
customPlot->xAxis->setRange(0, 5);
customPlot->yAxis->setRange(0, 30); // 動態范圍?
4)渲染與更新
調用 replot()
重繪圖形:
customPlot->replot(); // 強制刷新畫布?
完整示例代碼
#include "qcustomplot.h"// 在窗口構造函數中
QCustomPlot *customPlot = new QCustomPlot(this);
setCentralWidget(customPlot);// 添加數據
QVector<double> x(101), y(101);
for (int i=0; i<101; ++i) {x[i] = i/50.0 - 1; // -1 到 1y[i] = x[i]*x[i]; // 拋物線
}// 創建圖形
customPlot->addGraph();
customPlot->graph(0)->setData(x, y);// 設置坐標軸標簽
customPlot->xAxis->setLabel("x");
customPlot->yAxis->setLabel("y");// 自動縮放
customPlot->rescaleAxes();// 重繪
customPlot->replot();
四、核心功能詳解
1. 多種圖形類型
折線圖
customPlot->addGraph();
customPlot->graph(0)->setData(x, y);
customPlot->graph(0)->setPen(QPen(Qt::blue));
散點圖
customPlot->addGraph();
customPlot->graph(0)->setData(x, y);
customPlot->graph(0)->setScatterStyle(QCPScatterStyle::ssCircle);
customPlot->graph(0)->setLineStyle(QCPGraph::lsNone);
柱狀圖
QCPBars *bars = new QCPBars(customPlot->xAxis, customPlot->yAxis);
bars->setData(x, y);
bars->setWidth(0.2); // 柱寬
熱力圖
QCPColorMap *colorMap = new QCPColorMap(customPlot->xAxis, customPlot->yAxis);
colorMap->data()->setSize(200, 200)