QCustomPlot 叠加对象(Overlay Items)

QCustomPlot 提供了一系列可以在图表上叠加显示的对象(items),这些对象不属于数据本身,而是用于标注、辅助线等用途。以下是主要叠加对象的详细说明和使用方法。

1. QCPItemStraightLine (无限直线)

特性

  • 无限延伸的直线

  • 常用于参考线、基准线

创建与设置

QCPItemStraightLine *line = new QCPItemStraightLine(customPlot);
line->point1->setCoords(0, 5);  // 线上第一个点
line->point2->setCoords(1, 5);  // 线上第二个点(确定方向)
line->setPen(QPen(Qt::red, 2, Qt::DashLine));

常用方法

  • setPen() - 设置线条样式

  • point1point2 - 直线的两个定义点

2. QCPItemLine (有限线段)

特性

  • 两点之间的有限长度线段

  • 可以添加箭头

创建与设置

QCPItemLine *line = new QCPItemLine(customPlot);
line->start->setCoords(1, 1);  // 起点
line->end->setCoords(5, 3);    // 终点
line->setHead(QCPLineEnding::esSpikeArrow);  // 终点箭头
line->setPen(QPen(Qt::blue, 2));

常用方法

  • setHead()setTail() - 设置起点/终点箭头样式

  • setSelectedPen() - 设置选中时的线条样式

QCPItemStraightLine 与 QCPItemLine 的区别

几何特性区别

特性QCPItemStraightLineQCPItemLine
线条类型无限延伸的直线两点之间的有限线段
定义方式通过一个点和方向定义通过起点和终点定义
数学表示参数方程或斜截式两点之间的线段
实际绘制范围总是延伸到整个绘图区域仅在两点之间绘制

功能特性对比

功能QCPItemStraightLineQCPItemLine
箭头支持❌ 不支持✅ 支持
长度限制❌ 无限✅ 有限
方向表示需要两个点定义方向明确起点终点
适合场景参考线、基准线连接线、标注

坐标系统注意事项

两者都使用相同的坐标系统,但行为不同:

  • QCPItemStraightLine

    // 当图表缩放时,直线会自动延伸以适应新范围
    line->point1->setType(QCPItemPosition::ptPlotCoords);  // 使用绘图坐标
  • QCPItemLine

    // 线段长度固定,不会随缩放改变
    line->start->setType(QCPItemPosition::ptPlotCoords);
    line->end->setType(QCPItemPosition::ptPlotCoords);

性能考虑

  • QCPItemStraightLine 通常性能稍好,因为它的几何计算更简单。

  • QCPItemLine 在有大量箭头装饰时可能会有额外开销。

  • 两者在常规使用中性能差异不明显。

3. QCPItemText (文本标签)

特性

  • 可放置在任意位置的文本

  • 支持旋转和多种对齐方式

创建与设置

QCPItemText *text = new QCPItemText(customPlot);
text->position->setCoords(3, 4);  // 文本位置
text->setText("Important Point");
text->setFont(QFont("Arial", 12));
text->setColor(Qt::darkGreen);
text->setRotation(45);  // 旋转45度
text->setTextAlignment(Qt::AlignCenter);

常用方法

  • setPadding() - 设置文本内边距

  • setPositionAlignment() - 设置位置对齐方式

  • setBrush() - 设置背景填充

4. QCPItemRect (矩形)

特性

  • 可设置边框和填充的矩形

  • 常用于高亮显示区域

创建与设置

QCPItemRect *rect = new QCPItemRect(customPlot);
rect->topLeft->setCoords(1, 6);
rect->bottomRight->setCoords(4, 3);
rect->setPen(QPen(Qt::black));
rect->setBrush(QBrush(QColor(255, 200, 200, 100)));  // 半透明填充

常用方法

  • setRadius() - 设置圆角半径

  • setSelectedBrush() - 设置选中时的填充

5. QCPItemEllipse (椭圆)

特性

  • 可设置边框和填充的椭圆

  • 实际上是基于矩形的内切椭圆

创建与设置

QCPItemEllipse *ellipse = new QCPItemEllipse(customPlot);
ellipse->topLeft->setCoords(2, 5);
ellipse->bottomRight->setCoords(5, 2);
ellipse->setPen(QPen(Qt::darkBlue));
ellipse->setBrush(QBrush(QColor(200, 200, 255, 50)));

6. QCPItemPixmap (位图)

特性

  • 可以在图表上显示位图

  • 支持缩放和保持宽高比

创建与设置

QCPItemPixmap *pixmap = new QCPItemPixmap(customPlot);
pixmap->topLeft->setCoords(3, 7);
pixmap->setPixmap(QPixmap(":/images/logo.png"));
pixmap->setScaled(true, Qt::KeepAspectRatio);

通用属性和方法

所有叠加对象都继承自 QCPAbstractItem,具有以下通用功能:

  1. 位置控制

    • 使用锚点(QCPItemPosition)定义位置

    • 支持绝对坐标或相对坐标(轴坐标)

  2. 可选择性

    item->setSelectable(true);
    connect(customPlot, &QCustomPlot::itemClick, [](QCPAbstractItem *item, QMouseEvent *event) {qDebug() << "Item clicked:" << item;
    });
  3. 可见性控制

    item->setVisible(false);  // 隐藏项目
  4. 图层控制

    item->setLayer("overlay");  // 放置到特定图层

使用技巧

  1. 动态更新

    // 在重绘前更新项目位置
    connect(customPlot, &QCustomPlot::beforeReplot, [=](){textLabel->position->setCoords(customPlot->xAxis->range().center(), customPlot->yAxis->range().upper);
    });
  2. 批量操作

    // 隐藏所有项目
    foreach(QCPAbstractItem *item, customPlot->items()) {item->setVisible(false);
    }
  3. 交互示例

    // 创建可拖动的文本标签
    QCPItemText *dragText = new QCPItemText(customPlot);
    dragText->setText("Drag me");
    dragText->position->setType(QCPItemPosition::ptPlotCoords);
    dragText->position->setCoords(5, 5);
    dragText->setSelectable(true);// 启用拖动交互
    customPlot->setInteraction(QCP::iSelectItems, true);
    customPlot->setInteraction(QCP::iMoveItems, true);

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

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

相关文章

Flink源码阅读环境准备全攻略:搭建高效探索的基石

想要深入探索Flink的底层原理&#xff0c;搭建一套完整且适配的源码阅读环境是必经之路。这不仅能让我们更清晰地剖析代码逻辑&#xff0c;还能在调试过程中精准定位关键环节。接下来&#xff0c;结合有道云笔记内容&#xff0c;从开发工具安装、源码获取导入到调试配置&#x…

Dify,FastGPT,RagFlow有啥区别,在智能问答方面有啥区别

Dify、FastGPT、RagFlow都是当前非常流行的低代码AI应用开发平台&#xff0c;它们都专注于让用户能够快速构建AI应用&#xff0c;但在设计理念、功能特色和适用场景上有明显区别。 让我详细对比一下这三个平台&#xff1a; 1. 平台定位对比 Dify 定位&#xff1a;全栈AI应用…

基站定位接口如何如何用PHP实现调用?

随着“新基建”战略的推进&#xff0c;我国移动通信基站数量快速增长。截至2024年底&#xff0c;全国基站总数已达1265万个&#xff0c;其中5G基站超425万个&#xff0c;构建起全球规模最大、技术领先的通信网络。 在这一基础上&#xff0c;基站查询API通过整合三大运营商数据…

Day 4:Shell流程控制——从“直线思维“到“智能决策“的进化

目录 一、if语句&#xff1a;你以为简单其实暗藏杀机1. 基础语法&#xff08;看似简单却容易踩坑&#xff09;2. 安全写法规范&#xff08;企业级建议&#xff09; 二、条件测试的六大门派1. 文件测试&#xff08;运维最爱&#xff09;2. 字符串比较&#xff08;引号是灵魂&…

分布式训练中的随机种子策略:深入理解与实践指南

分布式训练中的随机种子策略&#xff1a;深入理解与实践指南 引言&#xff1a;一个容易被忽视的关键细节 在深度学习的分布式训练中&#xff0c;你是否见过这样的代码&#xff1f; torch.manual_seed(process_seed) # PyTorch操作 random.seed(process_seed) # Pyth…

金山办公发布WPS智慧教育平台,发力教育AI意义何在?

钛媒体消息&#xff0c;金山办公发布面向教育用户的 WPS 智慧教育平台&#xff0c;面对着金山办公的发力&#xff0c;我们该怎么分析呢&#xff1f; 首先&#xff0c;从市场拓展与用户需求响应角度看&#xff0c;金山办公此次推出WPS智慧教育平台&#xff0c;直接瞄准了教育领…

无人机航电系统之语音通信技术篇

无人机航电系统的语音通信技术是确保无人机与地面控制站、其他无人机或相关人员之间实现高效、稳定语音交互的关键技术&#xff0c;在军事侦察、应急救援、物流运输、航拍测绘等众多领域发挥着至关重要的作用。 一、技术原理 无人机航电系统的语音通信技术主要基于无线通信原理…

element plus 的树形控件,如何根据后台返回的节点key数组,获取节点key对应的node节点

在使用 Element Plus 的 el-tree 组件时&#xff0c;如果后端返回的节点 key 数组中包含了部分选中的父级节点的 key&#xff0c;可能会导致该父级节点下的所有子节点也被默认选中。这是因为 el-tree 的默认行为是&#xff1a;如果一个父节点被选中&#xff0c;那么其所有子节点…

什么是Sentinel

什么是 Sentinel? 在分布式系统中,服务间的依赖关系错综复杂。一个服务的故障,很可能像多米诺骨牌一样,迅速蔓延并导致整个系统崩溃,这就是我们常说的“雪崩效应”。为了避免这种灾难性后果,我们需要一种强大的机制来保护我们的系统,而 Sentinel 正是为此而生。 Senti…

AWS 使用图形化界面创建 EKS 集群(零基础教程)

无需命令行&#xff01;通过 AWS 控制台图形化操作&#xff0c;轻松创建 Kubernetes 集群。 文章目录 文章简介 一、准备工作&#xff1a;登录 AWS 控制台 二、创建 EKS 集群&#xff08;控制面&#xff09; 1. 创建 EKS 集群 2. 设置集群基本信息 3. 配置网络设置 三、添加…

[C#] Winform - 进程间通信(SendMessage篇)

一、发送端 // 窗体&#xff1a;发送端 public partial class SendForm : Form {public SendForm(){InitializeComponent();}// 按钮&#xff1a;发送private void btnSend_Click(object sender, System.EventArgs e){IntPtr hwnd User32Helper.FindWindow(null, "接收端…

锂电池保护板测试仪:守护电池安全的幕后保障

在电动汽车、储能电站和便携式电子设备中&#xff0c;锂电池作为核心动力源&#xff0c;其能量密度与安全性始终是行业关注的焦点。锂电池在过充、过放、短路等异常情况下可能引发起火甚至爆炸&#xff0c;而锂电池保护板正是解决这一问题的关键组件。为确保保护板性能可靠&…

Qemu搭建RISC-V,运行opensbi+u-boot+img

✨1.先下载一个Ubuntu镜像 https://cdimage.ubuntu.com/releases/24.04/release/ 我这里下载的是这个RISC-V的 &#x1f31f;1.2.解压镜像 xz -d ubuntu-24.04.2-preinstalled-server-riscv64.img.xz ✨2.准备RISC-V的QEMU 打开qemu官网https://www.qemu.org/&#xff0c…

【实战手册】银河麒麟服务器系统进入单用户模式修改密码(root)指南

目录 前言 一、银河麒麟单用户模式简介 二、进入单用户模式修改密码 三、登录验证新密码 结语 前言 在日常服务器运维工作中&#xff0c;忘记root密码是系统管理员偶尔会遇到的问题。作为国产操作系统的优秀代表&#xff0c;银河麒麟服务器系统提供了通过单用户模式重置r…

偏微分方程通解求解2

题目 求下列方程的通解: { u x y = u x u y u − 1 ; u x y = u x u y ; u x y = u x u y u u 2 + 1 ; \begin{cases} u_{xy} = u_x u_y u^{-1}; \\ u_{xy} = u_x u_y; \\ u_{xy} = \dfrac{u_x u_y u}{u^2 + 1}; \end{cases} ⎩⎪⎪⎨⎪⎪⎧​uxy​=ux​uy​u−1;uxy​=ux​…

用于算法性能预测的 GNN 框架

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 抽象。 数值黑盒优化中的自动算法性能预测通常依赖于问题特征&#xff0c;例如探索性景观分析特征。这些特征通常用作机器学习模型的输入&#xff0c;并以表格格式表示。然而&#xff0c;这种方法往往忽…

拯救海量数据:PostgreSQL分区表性能优化实战手册(附压测对比)

1 分区表核心原理与生产痛点 物理存储结构决定性能边界 PostgreSQL分区表的本质是继承表路由规则的逻辑封装。当父表被查询时&#xff0c;查询优化器通过CHECK约束快速定位子表&#xff0c;其性能核心取决于&#xff1a; -- 关键系统视图 SELECT relname, relkind, relpages …

【Wi-Fi天气时钟】网络授时

文章目录 1 网络授时概述1.1 什么是网络授时1.2 为什么要使用网络授时2 API概述2.1 什么是API2.2 如何使用API3 淘宝时间API简介4 网络授时流程和AT指令5 网络授时程序设计5.1 API返回信息解析5.2 RTC初始化5.3 必要的后续操作6 结语1 网络授时概述 1.1 什么是网络授时 首先我…

腾讯云IM即时通讯:开启实时通信新时代

一、引言 在当今数字化浪潮席卷全球的时代&#xff0c;即时通讯已然成为互联网世界中不可或缺的关键元素。无论是个人日常生活中的社交互动&#xff0c;还是企业运营里的高效协作&#xff0c;即时通讯都发挥着举足轻重的作用&#xff0c;已然渗透到人们生活与工作的每一个角落…

js逻辑:【增量更新机制】

增量更新机制&#xff1a;在数据发生变化时&#xff0c;只对变化的部分进行更新的策略&#xff0c;而不是每次都重新处理全部数据&#xff0c;即&#xff1a;在数据发生变化时&#xff0c;只对变化的部分进行更新的策略&#xff0c;而不是每次都重新处理全部数据 watch: {base…