From a2b4deb31072d2797462e87afe0bc2fb0548fdf9 Mon Sep 17 00:00:00 2001 From: zhangjiarui Date: Thu, 13 Aug 2026 21:08:56 +0800 Subject: [PATCH] fix: filter synthesized click after wheel/gesture to prevent trackpad flicker MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- libimageviewer/viewpanel/scen/imagegraphicsview.cpp | 13 ++++++++++++- libimageviewer/viewpanel/scen/imagegraphicsview.h | 2 ++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/libimageviewer/viewpanel/scen/imagegraphicsview.cpp b/libimageviewer/viewpanel/scen/imagegraphicsview.cpp index 7b38f8a8..739bad88 100644 --- a/libimageviewer/viewpanel/scen/imagegraphicsview.cpp +++ b/libimageviewer/viewpanel/scen/imagegraphicsview.cpp @@ -1046,7 +1046,8 @@ void LibImageGraphicsView::mouseReleaseEvent(QMouseEvent *e) } } } - if ((QDateTime::currentMSecsSinceEpoch() - m_clickTime) < 200 && abs(xpos) < 50) { + if ((QDateTime::currentMSecsSinceEpoch() - m_clickTime) < 200 && abs(xpos) < 50 && + (QDateTime::currentMSecsSinceEpoch() - m_lastWheelOrGestureTime) >= 300) { m_clickTime = QDateTime::currentMSecsSinceEpoch(); emit sigClicked(); } @@ -1062,6 +1063,12 @@ void LibImageGraphicsView::mouseReleaseEvent(QMouseEvent *e) void LibImageGraphicsView::mousePressEvent(QMouseEvent *e) { + // 过滤触摸板/触摸屏缩放手势结束后短时间内的合成点击,避免误触发查看模式切换 + if (e->source() == Qt::MouseEventSynthesizedByQt && + (QDateTime::currentMSecsSinceEpoch() - m_lastWheelOrGestureTime) < 300) { + e->accept(); + return; + } #ifdef tablet_PC m_press = true; #endif @@ -1353,6 +1360,7 @@ void LibImageGraphicsView::pinchTriggered(QPinchGesture *gesture) if (gesture->state() == Qt::GestureFinished) { m_isFirstPinch = false; + m_lastWheelOrGestureTime = QDateTime::currentMSecsSinceEpoch(); gesture->setCenterPoint(m_centerPoint); return; } @@ -1484,6 +1492,9 @@ void LibImageGraphicsView::hideSpinner() void LibImageGraphicsView::wheelEvent(QWheelEvent *event) { + // 记录滚轮时间戳,用于过滤手势结束后短时间内的合成点击 + m_lastWheelOrGestureTime = QDateTime::currentMSecsSinceEpoch(); + // 加载过程不可缩放 if (m_spinner && m_spinner->isVisible()) { return; diff --git a/libimageviewer/viewpanel/scen/imagegraphicsview.h b/libimageviewer/viewpanel/scen/imagegraphicsview.h index 699bb957..ec035a5f 100644 --- a/libimageviewer/viewpanel/scen/imagegraphicsview.h +++ b/libimageviewer/viewpanel/scen/imagegraphicsview.h @@ -249,6 +249,8 @@ private slots: //单击时间 qint64 m_clickTime{0}; + //最近一次滚轮/缩放手势的时间戳,用于过滤手势结束后合成的点击 + qint64 m_lastWheelOrGestureTime{0}; }; #endif // IMAGEVIEW_H