QCustomPlot滚轮缩放事件处理逻辑

该段代码处理QCPAxis的滚轮事件,用于图形缩放。首先检查缩放功能是否开启,然后计算滚轮转动步数并求缩放因子,最后应用缩放。缩放灵敏度取决于rangeZoomFactor的值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 源码如下

void QCPAxis::wheelEvent(QWheelEvent *event)
{
  // Mouse range zooming interaction:
  if (!mParentPlot->interactions().testFlag(QCP::iRangeZoom) ||
      !mAxisRect->rangeZoom().testFlag(orientation()) ||
      !mAxisRect->rangeZoomAxes(orientation()).contains(this))
  {
    event->ignore();
    return;
  }
  
#if QT_VERSION < QT_VERSION_CHECK(5, 0, 0)
  const double delta = event->delta();
#else
  const double delta = event->angleDelta().y();
#endif
  
#if QT_VERSION < QT_VERSION_CHECK(5, 14, 0)
  const QPointF pos = event->pos();
#else
  const QPointF pos = event->position();
#endif
  
  const double wheelSteps = delta/120.0; // a single step delta is +/-120 usually
  const double factor = qPow(mAxisRect->rangeZoomFactor(orientation()), wheelSteps);
  scaleRange(factor, pixelToCoord(orientation() == Qt::Horizontal ? pos.x() : pos.y()));
  mParentPlot->replot();
}

2. 源码理解(大概流程)

    1. 首先判断曲线图有没有设置缩放功能;
    1. 获取滚轮转动的角度event->angleDelta().y();
    1. 将滚轮转动的角度除以120,得到滚轮转动的步数;(触发鼠标事件的angleDelta值是120,实测得到);
    1. 使用滚轮转动的步数作为指数,用qPow求mAxisRect->rangeZoomFactor(orientation())的wheelSteps次方;
      这步是缩放的关键,其中mAxisRect->rangeZoomFactor(orientation())是0.85,wheelSteps是整数,所以得出的factor一定小于1。
      通过实验得出,当mAxisRect->rangeZoomFactor(orientation())的值越小,缩放就越灵敏,用手指缩放可以设置成0.5。
    1. 将计算出的缩放系数设置曲线图缩放,scaleRange也是一个关键函数,pixelToCoord是坐标转换的方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值