fix: filter synthesized click after wheel/gesture to prevent trackpad flicker - #180
fix: filter synthesized click after wheel/gesture to prevent trackpad flicker#180Resurgamz wants to merge 1 commit into
Conversation
… flicker 1. 新增成员 m_lastWheelOrGestureTime 记录最近一次滚轮/缩放手势时间戳; 2. 在 wheelEvent 和 pinchTriggered GestureFinished 中记录时间戳; 3. mousePressEvent 中过滤手势结束后 300ms 内的合成点击,避免误触发查看模式切换; 4. mouseReleaseEvent 合成分支的 sigClicked 发射增加同样的时间窗判断; ===================================== 1. added member m_lastWheelOrGestureTime to record last wheel/gesture timestamp; 2. recorded timestamp in wheelEvent and pinchTriggered GestureFinished; 3. filtered synthesized click within 300ms after gesture in mousePressEvent to avoid spurious view mode toggle; 4. added same time window check for sigClicked emission in mouseReleaseEvent synthesized branch; Log: 修复触摸板双指缩放后手指离开合成点击导致图片闪烁还原默认大小的问题,过滤手势结束后的合成点击 PMS: BUG-279597 Bug: https://pms.uniontech.com/bug-view-279597.html
There was a problem hiding this comment.
Sorry @Resurgamz, you have reached your weekly rate limit of 500000 diff characters.
Please try again later or upgrade to continue using Sourcery
|
[APPROVALNOTIFIER] This PR is NOT APPROVED This pull-request has been approved by: Resurgamz The full list of commands accepted by this bot can be found here. DetailsNeeds approval from an approver in each of these files:Approvers can indicate their approval by writing |
Reviewer's guide (collapsed on small PRs)Reviewer's GuideDebounces and filters synthesized mouse clicks generated shortly after wheel or pinch gestures in LibImageGraphicsView by tracking the last wheel/gesture timestamp and applying it symmetrically to mouse press/release handling, preventing unintended view mode toggles on trackpad zoom. Sequence diagram for debounced synthesized click after wheel/pinch gesturessequenceDiagram
actor User
participant QtEventSystem
participant LibImageGraphicsView
User->>QtEventSystem: trackpad pinch / wheel
QtEventSystem->>LibImageGraphicsView: wheelEvent(event)
LibImageGraphicsView->>LibImageGraphicsView: m_lastWheelOrGestureTime = currentMSecsSinceEpoch()
User->>QtEventSystem: end gesture
QtEventSystem->>LibImageGraphicsView: pinchTriggered(gesture)
LibImageGraphicsView->>LibImageGraphicsView: m_lastWheelOrGestureTime = currentMSecsSinceEpoch() (GestureFinished)
QtEventSystem->>LibImageGraphicsView: mousePressEvent(e)
alt synthesized mouse event within 300ms
LibImageGraphicsView->>LibImageGraphicsView: [e->source() == MouseEventSynthesizedByQt && now - m_lastWheelOrGestureTime < 300]
LibImageGraphicsView-->>QtEventSystem: e->accept(), return
else real or delayed click
LibImageGraphicsView->>LibImageGraphicsView: normal press handling
end
QtEventSystem->>LibImageGraphicsView: mouseReleaseEvent(e)
alt click within 200ms and small movement and not near gesture
LibImageGraphicsView->>LibImageGraphicsView: [now - m_clickTime < 200 && abs(xpos) < 50 && now - m_lastWheelOrGestureTime >= 300]
LibImageGraphicsView->>QtEventSystem: emit sigClicked()
else ignore as gesture artifact
LibImageGraphicsView->>LibImageGraphicsView: no sigClicked()
end
File-Level Changes
Tips and commandsInteracting with Sourcery
Customizing Your ExperienceAccess your dashboard to:
Getting Help
|
deepin pr auto review★ 总体评分:95分■ 【总体评价】
■ 【详细分析】
■ 【改进建议代码示例】 // 文件: imagegraphicsview.h
private:
// 定义交互判定阈值常量
static constexpr qint64 kClickIntervalThreshold = 200;
static constexpr int kMoveOffsetThreshold = 50;
static constexpr qint64 kGestureFilterInterval = 300;
//单击时间
qint64 m_clickTime{0};
//最近一次滚轮/缩放手势的时间戳,用于过滤手势结束后合成的点击
qint64 m_lastWheelOrGestureTime{0};
// 文件: imagegraphicsview.cpp
void LibImageGraphicsView::mouseReleaseEvent(QMouseEvent *e)
{
// ... 前置逻辑 ...
const qint64 currentTime = QDateTime::currentMSecsSinceEpoch();
if ((currentTime - m_clickTime) < kClickIntervalThreshold && abs(xpos) < kMoveOffsetThreshold &&
(currentTime - m_lastWheelOrGestureTime) >= kGestureFilterInterval) {
m_clickTime = currentTime;
emit sigClicked();
}
// ... 后置逻辑 ...
}
void LibImageGraphicsView::mousePressEvent(QMouseEvent *e)
{
// 过滤触摸板/触摸屏缩放手势结束后短时间内的合成点击,避免误触发查看模式切换
if (e->source() == Qt::MouseEventSynthesizedByQt &&
(QDateTime::currentMSecsSinceEpoch() - m_lastWheelOrGestureTime) < kGestureFilterInterval) {
e->accept();
return;
}
#ifdef tablet_PC
m_press = true;
#endif
// ... 后置逻辑 ...
}
void LibImageGraphicsView::pinchTriggered(QPinchGesture *gesture)
{
// ... 前置逻辑 ...
if (gesture->state() == Qt::GestureFinished) {
m_isFirstPinch = false;
m_lastWheelOrGestureTime = QDateTime::currentMSecsSinceEpoch();
gesture->setCenterPoint(m_centerPoint);
return;
}
// ... 后置逻辑 ...
}
void LibImageGraphicsView::wheelEvent(QWheelEvent *event)
{
// 记录滚轮时间戳,用于过滤手势结束后短时间内的合成点击
m_lastWheelOrGestureTime = QDateTime::currentMSecsSinceEpoch();
// 加载过程不可缩放
if (m_spinner && m_spinner->isVisible()) {
return;
}
// ... 后置逻辑 ...
} |
根因分析
PMS #279597 看图触摸板双指缩放闪烁:
LibImageGraphicsView::mousePressEvent(imagegraphicsview.cpp:1063)对任意按下无条件emit clicked(),不区分MouseEventSynthesizedByQt合成事件、不对滚轮/手势去抖。触摸板双指缩放后手指离开,Qt 合成的鼠标 press 命中此路径,误触发查看模式切换,最终经resizeEvent的setScaleValue(1.0)还原默认大小。同文件mouseReleaseEvent:1029/1049既有 source 过滤 + 200ms 去抖,press 侧缺失。关键证据:
mousePressEvent:1074无条件emit clicked()(与mouseReleaseEvent:1029/1049的过滤+去抖不对称)event():1207未接纳触摸事件致 Qt 合成鼠标事件setScaleValue(1.0)可见回弹修复方案
press/release 两侧对"滚轮/缩放手势结束后 300ms 内的合成点击"去抖过滤,与既有
mouseReleaseEvent过滤模式同构:m_lastWheelOrGestureTime,在wheelEvent/pinchTriggered GestureFinished中记录时间戳mousePressEvent中若e->source() == Qt::MouseEventSynthesizedByQt且 300ms 内 → 提前 returnmouseReleaseEvent合成分支的sigClicked()发射增加同样的时间窗判断改动安全评估
低风险:局部 early-return + 时间戳记录,无函数签名变更、无公开 API 变更。仅影响合成事件路径,真实鼠标点击与真实单指触摸翻页不受影响。blame 确认
emit clicked()来自 first commit(非历史 bug 修复),无回归风险。Summary by Sourcery
Debounce and filter synthesized mouse clicks following wheel and pinch gestures to prevent unintended view mode toggling and trackpad zoom flicker.
Bug Fixes: