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();
#elseconst double delta = event->angleDelta().y();
#endif#if QT_VERSION < QT_VERSION_CHECK(5, 14, 0)const QPointF pos = event->pos();
#elseconst QPointF pos = event->position();
#endifconst double wheelSteps = delta/120.0; // a single step delta is +/-120 usuallyconst double factor = qPow(mAxisRect->rangeZoomFactor(orientation()), wheelSteps);scaleRange(factor, pixelToCoord(orientation() == Qt::Horizontal ? pos.x() : pos.y()));mParentPlot->replot();
}
2. 源码理解(大概流程)
-
- 首先判断曲线图有没有设置缩放功能;
-
- 获取滚轮转动的角度event->angleDelta().y();
-
- 将滚轮转动的角度除以120,得到滚轮转动的步数;(触发鼠标事件的angleDelta值是120,实测得到);
-
- 使用滚轮转动的步数作为指数,用qPow求mAxisRect->rangeZoomFactor(orientation())的wheelSteps次方;
这步是缩放的关键,其中mAxisRect->rangeZoomFactor(orientation())是0.85,wheelSteps是整数,所以得出的factor一定小于1。
通过实验得出,当mAxisRect->rangeZoomFactor(orientation())的值越小,缩放就越灵敏,用手指缩放可以设置成0.5。
-
- 将计算出的缩放系数设置曲线图缩放,scaleRange也是一个关键函数,pixelToCoord是坐标转换的方法。