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()。
示例代码(部分)
cpp
#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()方法追加数据点,避免每次更新全部数据点,提升性能。
交互功能:
- 缩放:
cpp
customPlot->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom);
- 图例可点击,然后连接信号:
cpp
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()
高效重绘图表,适合动态数据流(如传感器数据):
cpp
// 动态追加数据示例
QVector<double> x, y;
x << 1 << 2 << 3;
y << 5 << 2 << 7;
customPlot->graph(0)->setData(x, y);
customPlot->replot(); // 刷新显示
数据选择与编辑
启用 setInteractions
支持数据点选择(单击/框选):
cpp
customPlot->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom | QCP::iSelectPlottables);
导出功能
一键导出为矢量图或位图:
cpp
customPlot->savePdf("chart.pdf", 0, 0); // PDF 矢量图
customPlot->savePng("chart.png", 800, 600); // PNG 位图
性能优化
大容量数据处理(十万级数据点)时启用 setOpenGl(true)
加速渲染。
通过 setAntialiasedElements
按需启用抗锯齿以平衡性能与质量。
部分代码
cpp
// 创建简单曲线图
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 线图、趋势线)
-
嵌入式设备数据显示(低资源占用)
-
学术论文图表生成(矢量输出)