From 7f528221b1c1c75efd274f5f666e00ac1bb40866 Mon Sep 17 00:00:00 2001 From: gongheng Date: Tue, 14 Jul 2026 20:06:50 +0800 Subject: [PATCH] fix: enable touch screen scrolling for QScrollArea-based views The PageDetail and PageDriverInstallInfo views use QScrollArea to display content, which only responds to mouse wheel events by default. On touch screens, finger swipe gestures do not trigger scrolling, causing text selection to be activated instead. Register QScroller gestures on the affected QScrollArea widgets to enable kinetic touch scrolling. Extract scroller properties into named constants in MacroDefinition.h for reuse and maintainability. Files changed: - MacroDefinition.h: add SCROLLER_OVERSHOOT_DISTANCE_FACTOR, SCROLLER_OVERSHOOT_DRAG_RESIST_FACTOR, SCROLLER_DRAG_VELOCITY_SMOOTH_FACTOR - PageDetail.cpp: register QScroller on mp_ScrollArea - PageDriverInstallInfo.cpp: register QScroller on driver list scroll area Log: fix issue Bug: https://pms.uniontech.com/bug-view-366201.html --- deepin-devicemanager/src/MacroDefinition.h | 5 +++++ deepin-devicemanager/src/Page/PageDetail.cpp | 11 ++++++++++- .../src/Page/PageDriverInstallInfo.cpp | 11 ++++++++++- 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/deepin-devicemanager/src/MacroDefinition.h b/deepin-devicemanager/src/MacroDefinition.h index 90986bde..f7237f3a 100644 --- a/deepin-devicemanager/src/MacroDefinition.h +++ b/deepin-devicemanager/src/MacroDefinition.h @@ -218,6 +218,11 @@ #define HORSCROLL_WIDTH 11 // TreeWidget 横向滚动条高度 #define MIN_NUM 5 // num +// 触摸屏滚动参数 +#define SCROLLER_OVERSHOOT_DISTANCE_FACTOR 0.3 // 超出滚动距离系数 +#define SCROLLER_OVERSHOOT_DRAG_RESIST_FACTOR 0.3 // 超出拖拽阻力系数 +#define SCROLLER_DRAG_VELOCITY_SMOOTH_FACTOR 0.6 // 拖拽速度平滑系数 + const QString LINK_STR = ""; // uos官网链接 const QString DEEPIN_LINK = ""; // 社区版链接 const QString END_STR = " "; // end html diff --git a/deepin-devicemanager/src/Page/PageDetail.cpp b/deepin-devicemanager/src/Page/PageDetail.cpp index 456fd55c..bf1c534e 100644 --- a/deepin-devicemanager/src/Page/PageDetail.cpp +++ b/deepin-devicemanager/src/Page/PageDetail.cpp @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2022 UnionTech Software Technology Co., Ltd. +// SPDX-FileCopyrightText: 2022 - 2026 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: GPL-3.0-or-later @@ -26,6 +26,8 @@ #include #include #include +#include +#include // 宏定义 #define SPACE_HEIGHT 0 // @@ -201,6 +203,13 @@ PageDetail::PageDetail(QWidget *parent) // 设置ScrollArea里面的widget,这个widget是必须要的 mp_ScrollWidget->setContentsMargins(15, 0, 0, 0); mp_ScrollArea->setWidget(mp_ScrollWidget); + // 启用触摸屏滚动支持 + QScroller::grabGesture(mp_ScrollArea, QScroller::LeftMouseButtonGesture); + QScrollerProperties sp; + sp.setScrollMetric(QScrollerProperties::OvershootScrollDistanceFactor, SCROLLER_OVERSHOOT_DISTANCE_FACTOR); + sp.setScrollMetric(QScrollerProperties::OvershootDragResistanceFactor, SCROLLER_OVERSHOOT_DRAG_RESIST_FACTOR); + sp.setScrollMetric(QScrollerProperties::DragVelocitySmoothingFactor, SCROLLER_DRAG_VELOCITY_SMOOTH_FACTOR); + QScroller::scroller(mp_ScrollArea)->setScrollerProperties(sp); hLayout->addWidget(mp_ScrollArea); setLayout(hLayout); diff --git a/deepin-devicemanager/src/Page/PageDriverInstallInfo.cpp b/deepin-devicemanager/src/Page/PageDriverInstallInfo.cpp index d255bbd7..f7a34254 100644 --- a/deepin-devicemanager/src/Page/PageDriverInstallInfo.cpp +++ b/deepin-devicemanager/src/Page/PageDriverInstallInfo.cpp @@ -1,8 +1,10 @@ -// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. +// SPDX-FileCopyrightText: 2023 - 2026 UnionTech Software Technology Co., Ltd. // // SPDX-License-Identifier: GPL-3.0-or-later #include +#include +#include #include @@ -64,6 +66,13 @@ void PageDriverInstallInfo::initUI() area->setMinimumHeight(10); area->setFrameShape(QFrame::NoFrame); area->setWidgetResizable(true); + // 启用触摸屏滚动支持 + QScroller::grabGesture(area, QScroller::LeftMouseButtonGesture); + QScrollerProperties sp; + sp.setScrollMetric(QScrollerProperties::OvershootScrollDistanceFactor, SCROLLER_OVERSHOOT_DISTANCE_FACTOR); + sp.setScrollMetric(QScrollerProperties::OvershootDragResistanceFactor, SCROLLER_OVERSHOOT_DRAG_RESIST_FACTOR); + sp.setScrollMetric(QScrollerProperties::DragVelocitySmoothingFactor, SCROLLER_DRAG_VELOCITY_SMOOTH_FACTOR); + QScroller::scroller(area)->setScrollerProperties(sp); DWidget *frame = new DWidget(this); frame->setContentsMargins(0, 0, 0, 0); QVBoxLayout *frameLayout = new QVBoxLayout();