当前位置: 首页 > news >正文

Qt:QCustomPlot类介绍

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 线图、趋势线)

  • 嵌入式设备数据显示(低资源占用)

  • 学术论文图表生成(矢量输出)

http://www.dtcms.com/a/275481.html

相关文章:

  • Python问题记录`No module named ‘matplotlib‘` 问题解决方案
  • 精密模具大深径比微孔尺寸检测方案 —— 激光频率梳 3D 轮廓检测
  • 论文阅读:HybridTrack: A Hybrid Approach for Robust Multi-Object Tracking
  • Java 大视界 -- 基于 Java 的大数据可视化在城市生态环境监测与保护决策中的应用(344)
  • sscanf函数使用详解
  • WinSnap 6.1.1 中文版安装教程(64位)- 详细步骤图解
  • 系统分析师-计算机系统-输入输出系统
  • 如何通过多层次测试策略确保 80%+ 测试覆盖率
  • 【Spring AOP】什么是AOP?切点、连接点、通知和切面
  • SELECT ... INTO OUTFILE和LOAD DATA INFILE
  • Power Switch:用途、原理、工作方式及实现方案
  • CSS选择器进行定位
  • OneCode 3.0 DDD领域模型开放接口:基于DSMFactory的架构解析与实践指南
  • OBOO鸥柏丨满天星(MTSTAR)多媒体信息发布系统技术解析
  • Vscode中使用C++代码进行debug
  • Javaweb- 11 MVC架构模式
  • [BJDCTF2020]ZJCTF,不过如此
  • HarmonyOS从入门到精通:动画设计与实现之六 - 动画曲线与运动节奏控制
  • Leetcode百题斩-二分搜索
  • 【C语言】回调函数、转移表、qsort 使用与基于qsort改造冒泡排序
  • linux_线程概念
  • 死锁的概念 ⚠️
  • 告别频繁登录!Nuxt3 + TypeScript + Vue3实战:双Token无感刷新方案全解析
  • TinyBERT:知识蒸馏驱动的BERT压缩革命 | 模型小7倍、推理快9倍的轻量化引擎
  • python-for循环
  • 【Elasticsearch】昂贵算法与廉价算法
  • UI前端大数据可视化实战策略分享:如何设计符合用户认知的数据可视化流程?
  • 让 VSCode 调试器像 PyCharm 一样显示 Tensor Shape、变量形状、变量长度、维度信息
  • 「日拱一码」025 机器学习——评价指标
  • Android音视频探索之旅 | C++层使用OpenGL ES实现音频渲染