1. 源码如下
void QCPAxis::wheelEvent(QWheelEvent *event)
{
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;
const 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是坐标转换的方法。