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

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);
}

相关文章:

  • Android S - 重复播放按键音(上下左右、OK)
  • 算法导论第四章:分治策略的艺术与科学
  • 北京大学肖臻老师《区块链技术与应用》公开课:08-BTC-比特币挖矿
  • HTML5实现好看的邀请函网页源码
  • Linux --基础IO
  • 010502管道符_防火墙出入站_不回显带外-渗透命令-基础入门-网络安全
  • 我自己动手写了一个MySQL自动化备份脚本,基于docker
  • Ingress-nginx 接入可观测性最佳实践
  • ELK日志采集系统
  • 从0到1:Dify AI智能体部署与使用全攻略
  • 聊聊 Glide | 不看源码,只聊设计
  • 【Zephyr 系列 23】构建 Web OTA 平台与远程运维工具链:从固件上传到设备在线升级全流程
  • OpenWrt:让OpenWrt支持USB声卡
  • Linux系统技能:用户权限精细化管理与性能调优秘籍分享
  • 永不休眠:Linux 守护进程的工作原理
  • 新一代python管理工具--uv
  • 戴尔 17G 服务器 E610 OCP千兆网卡驱动安装
  • 高频面试之11Flink
  • ar 导航导览技术如何实现的?室内外融合定位与ar渲染技术深度解析
  • 深入理解 PyTorch:从基础到高级应用
  • 网站流量怎么赚钱/企业网络推广计划书
  • 工信部网站信息查询/市场营销方案范文5篇
  • 网络营销的特点包括超前性/seo网站排名优化快速排
  • wordpress 网址 建站/广州seo公司排行
  • 做网站外国的/百度网盘app怎么打开链接
  • 工业产品设计作品集/谷歌优化seo