Windows平台QML中如何区分WheelEvent来自鼠标滚轮还是触控板
在Windows QML中区分鼠标滚轮与触控板的WheelEvent
在Windows系统下没法靠pixelDelta判断滚轮事件来源,不过可以通过两个特征来区分:
- angleDelta的步长差异:Windows标准鼠标滚轮的
angleDelta值是±120的整数倍(系统默认滚轮步长);而触控板滚动时,angleDelta会是更小的、非120倍数的连续数值。 - 事件的phase属性:触控板滚动会触发完整阶段事件——
WheelEvent.Begin(开始滚动)、WheelEvent.Update(滚动中)、WheelEvent.End(结束滚动);鼠标滚轮单次滚动触发的事件,phase通常是WheelEvent.NoPhase。
结合这两个特征,你可以修改代码里的isTrackPad判断逻辑,示例如下:
onWheel: { var horizontal = false; var delta = 0; var isTrackPad = false; // 判断是否为触控板的核心逻辑 var isNonStandardStep = (Math.abs(wheel.angleDelta.x) % 120 !== 0) || (Math.abs(wheel.angleDelta.y) % 120 !== 0); var hasScrollPhase = wheel.phase !== WheelEvent.NoPhase; isTrackPad = isNonStandardStep || hasScrollPhase; if (Math.abs(wheel.angleDelta.x) > Math.abs(wheel.angleDelta.y)) { delta = wheel.angleDelta.x; horizontal = true; } else { delta = wheel.angleDelta.y; } if ((isTrackPad && horizontal) || (!isTrackPad && wheel.modifiers === xxx.ScrollModifiersH)) { // 你的业务逻辑 } }
注意:部分特殊鼠标可能被修改为非120步长,这时候结合phase判断会更准确;如果用户调整了系统鼠标滚轮步长,步长判断可能失效,建议优先参考phase属性。
内容的提问来源于stack exchange,提问作者isudfv
相关产品推荐
相关产品推荐

