Skip to content

fix: enable touch screen scrolling for QScrollArea-based views#706

Merged
deepin-bot[bot] merged 1 commit into
linuxdeepin:masterfrom
GongHeng2017:202607141951-master-fix
Jul 14, 2026
Merged

fix: enable touch screen scrolling for QScrollArea-based views#706
deepin-bot[bot] merged 1 commit into
linuxdeepin:masterfrom
GongHeng2017:202607141951-master-fix

Conversation

@GongHeng2017

Copy link
Copy Markdown
Contributor

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

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

@sourcery-ai sourcery-ai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sorry @GongHeng2017, you have reached your weekly rate limit of 500000 diff characters.

Please try again later or upgrade to continue using Sourcery

@deepin-ci-robot

Copy link
Copy Markdown

deepin pr auto review

★ 总体评分:85分

■ 【总体评价】

代码实现了触摸屏滚动区域的功能支持,但存在代码重复和宏定义不规范问题
逻辑正确但因重复代码和C风格宏定义扣15分

■ 【详细分析】

  • 1.语法逻辑(基本正确)✓

在 PageDetail::PageDetail() 和 PageDriverInstallInfo::initUI() 中,QScroller 和 QScrollerProperties 的调用符合 Qt 接口规范,对象创建及方法调用顺序正确,能够实现触摸屏滚动功能。
潜在问题:QScroller::scroller() 返回的指针未进行非空校验,虽然 Qt 内部机制通常保证其有效性,但在极端异常情况下存在空指针解引用风险。
建议:在调用 setScrollerProperties 前对返回的指针进行非空判断。

  • 2.代码质量(一般)✕

在 PageDetail.cpp 第 206-211 行与 PageDriverInstallInfo.cpp 第 69-74 行存在完全相同的 6 行 QScroller 配置代码,违反 DRY 原则。MacroDefinition.h 中使用 C 风格的 #define 定义浮点数常量,而非 C++ 的 const double 或 constexpr,缺乏类型安全。版权声明年份修改为 2026 年,存在超前年份问题。
潜在问题:代码维护成本增加,若后续需调整滚动参数,必须同步修改多处;宏定义无类型检查,易引发隐性类型错误。
建议:将 QScroller 配置逻辑抽取为独立工具函数;将宏定义改为 const double 或 constexpr double 常量;修正版权年份为当前实际年份。

  • 3.代码性能(无性能问题)✓

新增代码仅在构造函数和初始化函数中执行一次,创建局部 QScrollerProperties 对象并设置属性的开销极小,不会对程序运行性能产生可察觉的影响。
建议:保持现有实现即可,无需优化。

  • 4.代码安全(存在0个安全漏洞)✓

漏洞对比统计:新增漏洞 0 个,减少漏洞 0 个,持平 0 个
本次代码变更仅涉及 UI 控件属性配置,不包含外部输入处理、网络通信、文件操作或系统命令执行,不存在可利用的安全风险。
建议:无需安全修复。

■ 【改进建议代码示例】

// MacroDefinition.h
// 将宏定义改为类型安全的常量
const double SCROLLER_OVERSHOOT_DISTANCE_FACTOR = 0.3;
const double SCROLLER_OVERSHOOT_DRAG_RESIST_FACTOR = 0.3;
const double SCROLLER_DRAG_VELOCITY_SMOOTH_FACTOR = 0.6;

// 新增工具函数(建议放在如 ScrollerUtils.h/cpp 中)
#include <QScroller>
#include <QScrollerProperties>

void setupScrollerProperties(QWidget *widget) 
{
    if (!widget) return;
    
    QScroller::grabGesture(widget, 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 = QScroller::scroller(widget);
    if (scroller) {
        scroller->setScrollerProperties(sp);
    }
}

// PageDetail.cpp
// 替换原有 6 行代码为单次调用
mp_ScrollArea->setWidget(mp_ScrollWidget);
setupScrollerProperties(mp_ScrollArea);
hLayout->addWidget(mp_ScrollArea);

// PageDriverInstallInfo.cpp
// 替换原有 6 行代码为单次调用
area->setWidgetResizable(true);
setupScrollerProperties(area);
DWidget *frame = new DWidget(this);

@deepin-ci-robot

Copy link
Copy Markdown

[APPROVALNOTIFIER] This PR is NOT APPROVED

This pull-request has been approved by: GongHeng2017, lzwind

The full list of commands accepted by this bot can be found here.

Details Needs approval from an approver in each of these files:

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

@GongHeng2017

Copy link
Copy Markdown
Contributor Author

/forcemerge

@deepin-bot

deepin-bot Bot commented Jul 14, 2026

Copy link
Copy Markdown
Contributor

This pr force merged! (status: unstable)

@deepin-bot deepin-bot Bot merged commit 6cf8633 into linuxdeepin:master Jul 14, 2026
22 of 23 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants