QCustomPlot入门

        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 内置了一套默认图层系统,用于组织不同类型的绘图元素。理解这些默认图层对于有效控制绘图顺序和元素管理非常重要。

默认图层层次结构(从底到顶)

  1. background - 最底层,适合放置背景元素

  2. grid - 网格线层

  3. main - 主图层,大多数plottables的默认层

  4. axes - 坐标轴层

  5. legend - 图例层

  6. 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);

默认图层的重要特性

  1. 自动创建:当创建QCustomPlot实例时,所有默认图层会自动创建

  2. 绘制顺序:图层的绘制顺序由QCustomPlot::mLayers列表决定,索引0最先绘制

  3. 默认分配

    QCPGraph *graph = customPlot->addGraph();  // 自动添加到"main"层
    QCPItemText *text = new QCPItemText(customPlot);  // 自动添加到"overlay"层
  4. 模式设置

    • lmLogical:直接绘制,无缓冲

    • lmBuffered:离屏缓冲后绘制(适合复杂静态内容)

 

三、QCustomPlot 基础入门

1. 安装与配置

源码集成
  1. 下载最新版 QCustomPlot 官网

  2. 将 qcustomplot.h 和 qcustomplot.cpp 添加到项目

  3. 在 .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)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/74030.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言快速入门-C语言基础知识

这个c语言入门&#xff0c;目标人群是有代码基础的&#xff0c;例如你之前学过javaSE&#xff0c;看此文章可能是更有帮助&#xff0c;会让你快速掌握他们之间的差异&#xff0c;文章内容大部分都是泛谈&#xff0c;详细的部分我会在之后时间发布&#xff0c;我也在慢慢学习&am…

【商城实战(91)】安全审计与日志管理:为电商平台筑牢安全防线

【商城实战】专栏重磅来袭!这是一份专为开发者与电商从业者打造的超详细指南。从项目基础搭建,运用 uniapp、Element Plus、SpringBoot 搭建商城框架,到用户、商品、订单等核心模块开发,再到性能优化、安全加固、多端适配,乃至运营推广策略,102 章内容层层递进。无论是想…

信息安全工程师第 1 章

《信息安全工程师教程(第2版)》第一章 一、网络信息安全基本概念与重要性 网络信息安全定义 狭义:保障信息系统的机密性(C)、完整性(I)、可用性(A)——CIA三性。广义:涵盖国家安全、经济安全、社会安全等的“大安全”。法律依据:《网络安全法》定义网络安全为防范攻…

为什么视频文件需要压缩?怎样压缩视频体积即小又清晰?

在日常生活中&#xff0c;无论是为了节省存储空间、便于分享还是提升上传速度&#xff0c;我们常常会遇到需要压缩视频的情况。本文将介绍为什么视频需要压缩&#xff0c;压缩视频的好处与坏处&#xff0c;并教你如何使用简鹿视频格式转换器轻松完成MP4视频文件的压缩。 为什么…

网络空间安全(45)PHP入门学习

一、PHP文件与结构 PHP文件扩展名&#xff1a;PHP文件通常以.php作为扩展名&#xff0c;例如index.php。 PHP代码嵌入&#xff1a;PHP代码可以嵌入到HTML文件中&#xff0c;通常使用<?php ... ?>标签包围PHP代码。短标签<? ... ?>在某些配置下也可以使用&…

深入 OpenPDF:高级 PDF 生成与操作技巧

1 引言 1.1 项目背景 在许多企业级应用中,生成和操作 PDF 文档是一个常见的需求。PDF(Portable Document Format)因其格式统一、易于打印和分发而被广泛使用。本文将介绍如何使用 OpenPDF 库在 Java 项目中生成和操作 PDF 文档。 1.2 技术选型理由 OpenPDF:OpenPDF 是一…

力扣hot100——最长连续序列(哈希unordered_set)

题目链接&#xff1a;最长连续序列 1、错解&#xff1a;数组做哈希表&#xff08;内存超出限制&#xff09; int longestConsecutive(vector<int>& nums) {vector<bool> hash(20000000010, false);for(int i0; i<nums.size();i){hash[1000000000nums[i]]t…

Qt中信号带参传值

在我们的Qt信号中是可以进行参数的传递的&#xff0c;不过格式上与写普通函数不同。 这是头文件中定义一个含参信号和一个含参槽函数 我们再来看它们两个的绑定 。第一行的clicked()和on_btn_clicked()就是普通无参信号和槽的绑定&#xff1b;第二行就是上图中两个带参信号和槽…

CSS3学习教程,从入门到精通, CSS3 列表控制详解语法知识点及案例代码(24)

CSS3 列表控制详解 CSS 列表控制的语法知识点及案例代码的详细说明&#xff0c;包括 list-style-type、list-style-image、list-style-position 和 list-style 的用法。 1. list-style-type 属性 list-style-type 属性用于设置列表项标记的类型。 语法 list-style-type: v…

用Deepseek写扫雷uniapp小游戏

扫雷作为Windows系统自带的经典小游戏&#xff0c;承载了许多人的童年回忆。本文将详细介绍如何使用Uniapp框架从零开始实现一个完整的扫雷游戏&#xff0c;包含核心算法、交互设计和状态管理。无论你是Uniapp初学者还是有一定经验的开发者&#xff0c;都能从本文中获得启发。 …

Dust3r、Mast3r、Fast3r

目录 一.Dust3r 1.简述 2.PointMap与ConfidenceMap 3.模型结构 4.损失函数 5.全局对齐 二.Mast3r 1.简述 2.MASt3R matching 3.MASt3R sfm 匹配与标准点图 BA优化 三.Fast3r 1.简述 2.模型结构 3.损失函数 三维重建是计算机视觉中的一个高层任务&#xff0c;包…

学习不同电脑cpu分类及选购指南

学习不同电脑cpu分类及选购指南 关于电脑cpu 学习不同电脑cpu分类及选购指南一、CPU型号的核心组成与命名规则Intel命名规则:AMD命名规则:代数:具体型号:cpu后缀:Intel常见后缀及其含义:AMD后缀常见后缀及其含义:二、主流品牌CPU的分类与性能差异三、区分CPU型号的实用方…

【身份安全】零信任安全框架梳理(一)

目录 零信任网络安全防护理念一、定义零信任原则 二、零信任实现方式三、零信任的核心机制和思想1. 持续验证&#xff08;Continuous Verification&#xff09;2. 多因素认证&#xff08;MFA&#xff09;与强身份验证3. 细粒度权限控制&#xff08;最小权限原则&#xff09;4. …

【LeetCode Solutions】LeetCode 101 ~ 105 题解

CONTENTS LeetCode 101. 对称二叉树&#xff08;简单&#xff09;LeetCode 102. 二叉树的层序遍历&#xff08;中等&#xff09;LeetCode 103. 二叉树的锯齿形层序遍历&#xff08;中等&#xff09;LeetCode 104. 二叉树的最大深度&#xff08;简单&#xff09;LeetCode 105. 从…

革新汽车安全通信技术,美格智能全系车载通信模组支持NG-eCall

根据QYR&#xff08;恒州博智&#xff09;的统计及预测&#xff0c;2024年全球汽车无线紧急呼叫&#xff08;eCall&#xff09;设备市场销售额达到了25.17亿美元&#xff0c;预计2031年将达到44.97亿美元&#xff0c;年复合增长率&#xff08;CAGR 2025-2031&#xff09;为8.8%…

Redis-04.Redis常用命令-字符串常用命令

一.字符串操作命令 set name jack 点击左侧name&#xff0c;显示出值。 get name get abc&#xff1a;null setex key seconds value&#xff1a;设置过期时间&#xff0c;过期后该键值对将会被删除。 然后再get&#xff0c;在过期时间内可以get到&#xff0c;过期get不到。…

一文总结常见项目排查

慢sql排查 怎么排查 通过如下命令&#xff0c;开启慢 SQL 监控&#xff0c;执行成功之后&#xff0c;客户端需要重新连接才能生效。 -- 开启慢 SQL 监控 set global slow_query_log 1; 默认的慢 SQL 阀值是10秒&#xff0c;可以通过如下语句查询慢 SQL 的阀值。 -- 查询慢…

使用Python爬虫获取淘宝App商品详情

在电商领域&#xff0c;获取商品详情数据对于市场分析、竞品研究和用户体验优化至关重要。淘宝作为国内领先的电商平台&#xff0c;提供了丰富的商品资源。虽然淘宝App的数据获取相对复杂&#xff0c;但通过Python爬虫技术&#xff0c;我们可以高效地获取淘宝App商品的详细信息…

Redis-06.Redis常用命令-列表操作命令

一.列表操作命令 LPUSH key value1 [value2]&#xff1a; LPUSH mylist a b c d: LRANGE key start stop&#xff1a; LRANGE mylist 0 -1&#xff1a; lrange mylist 0 2&#xff1a; d c b RPOP KEY&#xff1a;移除并返回最后一个元素 RPOP list a LLEN key…

客户端给服务器发数据,服务器不显示:开放端口操作

当你写完UDP/TCP代码进行测试时&#xff0c;发现没出什么错误&#xff0c;但是不管你客户端怎么发送消息&#xff0c;服务器就是不显示&#xff0c;那么很有可能你云服务器没开放端口。比如&#xff1a; 接下来教你开放端口&#xff1a; 一&#xff1a;进入你买云服务器的页面…