From 279276993a3ce828351a69fea7f5b9b89b392116 Mon Sep 17 00:00:00 2001 From: gongheng Date: Thu, 18 Jun 2026 14:31:11 +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 | 13 ++++++++++++- 3 files changed, 28 insertions(+), 1 deletion(-) diff --git a/deepin-devicemanager/src/MacroDefinition.h b/deepin-devicemanager/src/MacroDefinition.h index 0064dfe62..c6fd8fd04 100644 --- a/deepin-devicemanager/src/MacroDefinition.h +++ b/deepin-devicemanager/src/MacroDefinition.h @@ -215,6 +215,11 @@ #define WIDGET_MARGIN 2 // 页边距 #define BOTTOM_MARGIN 11 // 下边距 #define LABEL_MARGIN 12 // 页面标签的上下边距 + +// 触摸屏滚动参数 +#define SCROLLER_OVERSHOOT_DISTANCE_FACTOR 0.3 // 超出滚动距离系数 +#define SCROLLER_OVERSHOOT_DRAG_RESIST_FACTOR 0.3 // 超出拖拽阻力系数 +#define SCROLLER_DRAG_VELOCITY_SMOOTH_FACTOR 0.6 // 拖拽速度平滑系数 #define HORSCROLL_WIDTH 11 // TreeWidget 横向滚动条高度 #define MIN_NUM 5 // num diff --git a/deepin-devicemanager/src/Page/PageDetail.cpp b/deepin-devicemanager/src/Page/PageDetail.cpp index f7ccf8f5b..eb2143225 100644 --- a/deepin-devicemanager/src/Page/PageDetail.cpp +++ b/deepin-devicemanager/src/Page/PageDetail.cpp @@ -25,6 +25,8 @@ #include #include #include +#include +#include // 宏定义 #define SPACE_HEIGHT 0 // @@ -180,6 +182,15 @@ 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 594afe21a..08a527a65 100644 --- a/deepin-devicemanager/src/Page/PageDriverInstallInfo.cpp +++ b/deepin-devicemanager/src/Page/PageDriverInstallInfo.cpp @@ -1,9 +1,11 @@ -// 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 #include "PageDriverInstallInfo.h" @@ -58,6 +60,15 @@ 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();