QCustomPlot 中实现拖动区域放大‌与恢复

1、拖动区域放大

在 QCustomPlot 中实现 ‌拖动区域放大‌(即通过鼠标左键拖动绘制矩形框选区域进行放大)的核心方法是设置 SelectionRectMode。具体操作步骤:

1‌)禁用拖动模式
确保先关闭默认的图表拖动功能(否则会冲突)。

customPlot->setInteraction(QCP::iRangeDrag, false); // 关闭拖动

2‌)启用框选放大模式
设置选择矩形模式为 srmZoom。

customPlot->setSelectionRectMode(QCP::SelectionRectMode::srmZoom); // 启用框选放大

3)视觉效果定制(可选)
可自定义选框的边框和填充颜色。

customPlot->selectionRect()->setPen(QPen(Qt::black, 1, Qt::DashLine)); // 虚线边框
customPlot->selectionRect()->setBrush(QBrush(QColor(0,0,100,50)));    // 半透明蓝色填充

‌注意:拖拽与框选模式互斥‌
拖动 (iRangeDrag) 与框选放大 (srmZoom) ‌无法同时生效‌。若需切换功能(如右键拖动、左键框选),需自定义鼠标事件处理逻辑 。

2、 恢复原始视图

添加按钮或快捷键调用 rescaleAxes() 可一键重置坐标轴显示范围。或通过 setRange 手动重置坐标轴范围。

右键点击回到未放大状态‌(撤销缩放操作)的功能,可以通过以下两种方式实现。

1)方式一:使用内置复位按钮(推荐简单场景)

添加复位按钮‌
创建按钮触发 rescaleAxes() 恢复初始视图:

    customPlot->rescaleAxes();  // 自动重置坐标轴范围customPlot->replot();       // 重绘图表

右键菜单集成复位选项‌
在右键菜单中添加"复位"选项:

void MyCustomPlot::contextMenuEvent(QContextMenuEvent *event) {QMenu menu(this);QAction *resetAction = menu.addAction("复位");connect(resetAction, &QAction::triggered, this, &MyCustomPlot::onResetZoom);menu.exec(event->globalPos());
}void MyCustomPlot::onResetZoom() {rescaleAxes();replot();
}

2)方式二:缩放历史栈

适用于需要逐步撤销多次缩放操作的场景:

2.1)定义历史记录栈

QStack<QPair<QCPRange, QCPRange>> zoomHistory; // 存储(x轴范围, y轴范围)

2.2)保存缩放前的状态‌
在缩放操作前保存当前坐标轴范围:

void MyCustomPlot::beforeZoom() {zoomHistory.push(qMakePair(xAxis->range(), yAxis->range()));
}

‌2.3)右键触发撤销操作

void MyCustomPlot::mousePressEvent(QMouseEvent *event) {if (event->button() == Qt::RightButton && !zoomHistory.isEmpty()) {QPair<QCPRange, QCPRange> prevRange = zoomHistory.pop();xAxis->setRange(prevRange.first);   // 恢复x轴yAxis->setRange(prevRange.second);  // 恢复y轴replot();}QCustomPlot::mousePressEvent(event);
}

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

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

相关文章

如何将文件从 iPhone 传输到闪存驱动器

您想将文件从 iPhone 或 iPad 传输到闪存盘进行备份吗&#xff1f;这是一个很好的决定&#xff0c;但您需要先了解一些实用的方法。虽然 Apple 生态系统在很大程度上是封闭的&#xff0c;但您可以使用一些实用工具将文件从 iPhone 或 iPad 传输到闪存盘。下文提供了这些行之有效…

互联网大厂Java求职面试:云原生架构与微服务设计中的复杂挑战

互联网大厂Java求职面试&#xff1a;云原生架构与微服务设计中的复杂挑战 面试官开场白 面试官&#xff08;严肃模式开启&#xff09;&#xff1a;郑薪苦&#xff0c;欢迎来到我们的技术面试环节。我是本次面试的技术总监&#xff0c;接下来我们将围绕云原生架构、微服务设计、…

leetcode-hot-100 (链表)

1. 相交链表 题目链接&#xff1a;相交链表 题目描述&#xff1a;给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 。 解答&#xff1a; 其实这道题目我一开始没太看懂题目给…

Web前端基础之HTML

一、浏览器 火狐浏览器、谷歌浏览器(推荐)、IE浏览器 推荐谷歌浏览器原因&#xff1a; 1、简洁大方,打开速度快 2、开发者调试工具&#xff08;右键空白处->检查&#xff0c;打开调试模式&#xff09; 二、开发工具 核心IDE工具 Visual Studio Code (VS Code)‌ 微软开发…

11.TCP三次握手

TCP连接建立与传输 1&#xff0e;主机 A 与主机 B 使用 TCP 传输数据&#xff0c;A 是 TCP 客户&#xff0c;B 是 TCP 服务器。假设有512B 的数据要传输给 B&#xff0c;B 仅给 A 发送确认&#xff1b;A 的发送窗口 swnd 的尺寸为 100B&#xff0c;而 TCP 数据报文段每次也携带…

Python 爬虫入门 Day 3 - 实现爬虫多页抓取与翻页逻辑

Python 第二阶段 - 爬虫入门 &#x1f3af; 今日目标 掌握网页分页的原理和定位“下一页”的链接能编写循环逻辑自动翻页抓取内容将多页抓取整合到爬虫系统中 &#x1f4d8; 学习内容详解 &#x1f501; 网页分页逻辑介绍 以 quotes.toscrape.com 为例&#xff1a; 首页链…

分布式定时任务系列12:XXL-job的任务触发为什么是死循环?

传送门 分布式定时任务系列1&#xff1a;XXL-job安装 分布式定时任务系列2&#xff1a;XXL-job使用 分布式定时任务系列3&#xff1a;任务执行引擎设计 分布式定时任务系列4&#xff1a;任务执行引擎设计续 分布式定时任务系列5&#xff1a;XXL-job中blockingQueue的应用 …

位运算详解之异或运算的奇妙操作

位运算详解之异或运算的奇妙操作 一、异或运算的本质与核心性质1.1 异或运算的定义与逻辑规则1.2 异或运算的核心代数性质&#xff08;1&#xff09;自反性&#xff1a;a ^ a 0&#xff08;2&#xff09;恒等性&#xff1a;a ^ 0 a&#xff08;3&#xff09;交换律&#xff1…

Element Plus 去除下拉菜单周黑边

问题&#xff1a; 如上图所示&#xff0c;当鼠标移入&#xff08;hover&#xff09;和点击时就会围绕一圈黑色边框&#xff0c;但通过本文的方案 100% 完美解决。 解决方案: :deep(:focus-visible) {outline: none; } 备用方案 :deep(.el-tooltip__trigger:focus-visible) …

React Native 项目实战 —— 记账本应用开发指南

React Native 项目实战 —— 记账本应用开发指南 项目概述&#xff1a;本文将指导您使用 React Native 开发一个简单的记账本应用&#xff0c;帮助用户记录收入和支出。核心内容&#xff1a;我们将分析功能模块、设计接口、划分组件结构、管理数据流、实现页面跳转&#xff0c…

从 PPO、DPO 到 GRPO:大语言模型策略优化算法解析

从 PPO、DPO 到 GRPO&#xff1a;大语言模型策略优化算法解析 背景与简介 大语言模型&#xff08;LLM&#xff09;的训练通常分为预训练和后训练两个阶段。预训练阶段&#xff0c;模型在海量文本上学习下一词预测的能力&#xff1b;后训练阶段&#xff0c;我们希望进一步对齐…

React中使用Day.js指南

文章目录 引言什么是Day.js&#xff1f;Day.js的核心特性 安装和基础配置安装Day.js基础导入和使用 在React中的基础使用1. 显示格式化日期2. 实时时钟组件 常用插件配置1. 相对时间插件2. 高级格式化插件3. 时区处理插件 实战案例&#xff1a;博客文章时间组件高级应用场景1. …

【系统设计【1】】系统设计面试方法论:从0到百万用户的需求到架构的推演

文章目录 一、系统设计面试的底层逻辑&#xff1a;从需求到架构的推演&#xff08;一&#xff09;需求澄清&#xff1a;界定问题边界&#xff08;二&#xff09;分层设计&#xff1a;从单节点到分布式的演进1. Web层&#xff1a;无状态化与负载均衡2. 数据层&#xff1a;数据库…

京津冀城市群13城市空间权重0-1矩阵

京津冀城市群13城市空间权重0-1矩阵 1、数据说明&#xff1a;京津冀13个城市&#xff1a;北京市、保定市、沧州市、承德市、邯郸市、衡水市、廊坊市、秦皇岛市、石家庄市、唐山市、邢台市、张家口市、天津市、 2、指标解释&#xff1a;空间权重矩阵是一种用于表征空间表达式的…

七大技术路线解析:自动驾驶如何被数据重新定义

自动驾驶技术从实验室的算法验证走向大规模量产应用&#xff0c;是一场充满挑战的征程。这段征程的核心驱动力&#xff0c;不仅是芯片和传感器的升级&#xff0c;更是一场关于数据的“喂养”竞赛——从简单的像素标注到多模态大模型的理解&#xff0c;数据需求的演变悄然推动着…

计网复习知识(16)传输层及其协议功能

目录 考研大纲 1.传输层概述 端口号 有连接/无连接传输 可靠/不可靠传输 2.UDP协议 2.1 udp数据报 2.2 udp检验 3.TCP协议 3.1 TCP协议的框架梳理 3.2 TCP报文段**** 3.3 三次握手与四次挥手 三次握手 四次挥手 3.4 可靠传输与流量控制 流量控制&#xff1a;滑动…

每天一个前端小知识 Day 1

语义化 HTML&#xff08;Semantic HTML&#xff09; 1. 什么是语义化 HTML&#xff1f; 语义化 HTML 指的是使用符合内容含义的标签&#xff0c;而不仅仅为了布局或样式。例如&#xff1a; <article>…</article> <nav>…</nav> <header>…&l…

在docker中部署mysql

部署 MySQL&#xff08;端口 9006&#xff09; 1. 创建数据目录 mkdir -p ~/qihuang/mysql/data2. 启动 MySQL 容器 docker run -d \--name mysql-qihuang \-p 9006:3306 \-v ~/qihuang/mysql/data:/var/lib/mysql \-e MYSQL_ROOT_PASSWORDroot \-e MYSQL_DATABASEqihuangdb…

JavaScript基础-事件对象

一、前言 在前端开发中&#xff0c;用户与页面的交互行为&#xff08;如点击按钮、输入文本、滚动页面等&#xff09;都会触发相应的事件。而这些事件发生时&#xff0c;浏览器会自动创建一个 事件对象&#xff08;Event Object&#xff09;&#xff0c;它包含了当前事件的所有…

蓝桥杯_染色_bfs_Java

临时抱抱佛脚&#xff0c;太浮躁了&#xff0c;蓝桥杯已经快1个半月没做题了。 本人比较菜&#xff0c;感觉这个时间节点也只能把暴力题给尽量多做做&#xff0c;找找做题手感&#xff0c;其他就纯凭运气了吧。T-T。 题目 问题描述 小蓝有一个 n 行 m 列的白色棋盘, 棋盘的每一…