fix: support scroll on touch screen#511
Conversation
Reviewer's guide (collapsed on small PRs)Reviewer's GuideConfigures QScroller-based touch scrolling for NetView’s viewport, enabling touch gesture scrolling and customizing scroller properties to remove overshoot and tune scrolling dynamics on touch screens. Sequence diagram for NetView constructor touch scrolling setupsequenceDiagram
participant NetManager
participant NetView
participant QAbstractItemView as ViewportOwner
participant QWidget as Viewport
participant QScroller
participant QScrollerProperties as Props
NetManager ->> NetView: create NetView(manager)
NetView ->> ViewportOwner: viewport()
ViewportOwner -->> NetView: Viewport
NetView ->> QScroller: grabGesture(Viewport, TouchGesture)
NetView ->> QScroller: scroller(Viewport)
QScroller -->> NetView: scrollerInstance
NetView ->> QScroller: scrollerProperties()
QScroller -->> NetView: Props
NetView ->> Props: setScrollMetric(VerticalOvershootPolicy, OvershootAlwaysOff)
NetView ->> Props: setScrollMetric(HorizontalOvershootPolicy, OvershootAlwaysOff)
NetView ->> Props: setScrollMetric(DecelerationFactor, 0.5)
NetView ->> Props: setScrollMetric(MaximumVelocity, 0.5)
NetView ->> QScroller: setScrollerProperties(Props)
Updated class diagram for NetView touch scrolling configurationclassDiagram
class NetView {
+NetView(manager : NetManager*)
+~NetView()
}
class NetManager
class QAbstractItemView {
+viewport() : QWidget*
}
class QWidget
class QScroller {
+static grabGesture(target : QObject*, gestureType : GestureType) : void
+static scroller(target : QObject*) : QScroller*
+scrollerProperties() : QScrollerProperties
+setScrollerProperties(properties : QScrollerProperties) : void
}
class QScrollerProperties {
+setScrollMetric(metric : ScrollMetric, value : double) : void
}
NetView --|> QAbstractItemView
NetView --> NetManager
NetView ..> QScroller : configures_scrolling
NetView ..> QScrollerProperties : updates_properties
QScroller o--> QScrollerProperties
QAbstractItemView o--> QWidget : owns_viewport
File-Level Changes
Tips and commandsInteracting with Sourcery
Customizing Your ExperienceAccess your dashboard to:
Getting Help
|
There was a problem hiding this comment.
Hey - I've found 1 issue, and left some high level feedback:
- Consider avoiding hard-coded magic values for DecelerationFactor and MaximumVelocity (e.g., define named constants or add a brief comment) so the chosen tuning parameters are easier to understand and adjust later.
- You call QScroller::scroller(viewport()) multiple times; caching the pointer in a local variable would slightly simplify the code and avoid duplicate lookups.
Prompt for AI Agents
Please address the comments from this code review:
## Overall Comments
- Consider avoiding hard-coded magic values for DecelerationFactor and MaximumVelocity (e.g., define named constants or add a brief comment) so the chosen tuning parameters are easier to understand and adjust later.
- You call QScroller::scroller(viewport()) multiple times; caching the pointer in a local variable would slightly simplify the code and avoid duplicate lookups.
## Individual Comments
### Comment 1
<location path="net-view/window/netview.cpp" line_range="85-93" />
<code_context>
+ QScrollerProperties sp = QScroller::scroller(viewport())->scrollerProperties();
+ sp.setScrollMetric(QScrollerProperties::VerticalOvershootPolicy, QScrollerProperties::OvershootAlwaysOff);
+ sp.setScrollMetric(QScrollerProperties::HorizontalOvershootPolicy, QScrollerProperties::OvershootAlwaysOff);
+ sp.setScrollMetric(QScrollerProperties::DecelerationFactor, 0.5);
+ sp.setScrollMetric(QScrollerProperties::MaximumVelocity, 0.5);
+ QScroller::scroller(viewport())->setScrollerProperties(sp);
}
</code_context>
<issue_to_address>
**suggestion:** Consider extracting scroll tuning constants or referencing expected ranges.
These hard-coded `0.5` values effectively lock in your touch scroll UX and may need tuning later. Consider naming these as shared constants or centralizing them in a config so they’re easier to adjust, reason about, and keep aligned with Qt’s recommended or platform-specific ranges.
```suggestion
// 支持在触摸屏上滚动
constexpr qreal kTouchScrollDecelerationFactor = 0.5; // Tunable: see Qt docs for recommended ranges
constexpr qreal kTouchScrollMaximumVelocity = 0.5; // Tunable: see Qt docs for recommended ranges
QScroller::grabGesture(viewport(), QScroller::TouchGesture);
QScroller *scroller = QScroller::scroller(viewport());
QScrollerProperties sp = scroller->scrollerProperties();
sp.setScrollMetric(QScrollerProperties::VerticalOvershootPolicy, QScrollerProperties::OvershootAlwaysOff);
sp.setScrollMetric(QScrollerProperties::HorizontalOvershootPolicy, QScrollerProperties::OvershootAlwaysOff);
sp.setScrollMetric(QScrollerProperties::DecelerationFactor, kTouchScrollDecelerationFactor);
sp.setScrollMetric(QScrollerProperties::MaximumVelocity, kTouchScrollMaximumVelocity);
scroller->setScrollerProperties(sp);
}
```
</issue_to_address>Help me be more useful! Please click 👍 or 👎 on each comment and I'll use the feedback to improve your reviews.
| // 支持在触摸屏上滚动 | ||
| // QScroller::grabGesture(viewport(), QScroller::LeftMouseButtonGesture); | ||
| // QScrollerProperties sp; | ||
| // sp.setScrollMetric(QScrollerProperties::VerticalOvershootPolicy, QScrollerProperties::OvershootAlwaysOff); | ||
| QScroller::grabGesture(viewport(), QScroller::TouchGesture); | ||
| QScrollerProperties sp = QScroller::scroller(viewport())->scrollerProperties(); | ||
| sp.setScrollMetric(QScrollerProperties::VerticalOvershootPolicy, QScrollerProperties::OvershootAlwaysOff); | ||
| sp.setScrollMetric(QScrollerProperties::HorizontalOvershootPolicy, QScrollerProperties::OvershootAlwaysOff); | ||
| sp.setScrollMetric(QScrollerProperties::DecelerationFactor, 0.5); | ||
| sp.setScrollMetric(QScrollerProperties::MaximumVelocity, 0.5); | ||
| QScroller::scroller(viewport())->setScrollerProperties(sp); | ||
| } |
There was a problem hiding this comment.
suggestion: Consider extracting scroll tuning constants or referencing expected ranges.
These hard-coded 0.5 values effectively lock in your touch scroll UX and may need tuning later. Consider naming these as shared constants or centralizing them in a config so they’re easier to adjust, reason about, and keep aligned with Qt’s recommended or platform-specific ranges.
| // 支持在触摸屏上滚动 | |
| // QScroller::grabGesture(viewport(), QScroller::LeftMouseButtonGesture); | |
| // QScrollerProperties sp; | |
| // sp.setScrollMetric(QScrollerProperties::VerticalOvershootPolicy, QScrollerProperties::OvershootAlwaysOff); | |
| QScroller::grabGesture(viewport(), QScroller::TouchGesture); | |
| QScrollerProperties sp = QScroller::scroller(viewport())->scrollerProperties(); | |
| sp.setScrollMetric(QScrollerProperties::VerticalOvershootPolicy, QScrollerProperties::OvershootAlwaysOff); | |
| sp.setScrollMetric(QScrollerProperties::HorizontalOvershootPolicy, QScrollerProperties::OvershootAlwaysOff); | |
| sp.setScrollMetric(QScrollerProperties::DecelerationFactor, 0.5); | |
| sp.setScrollMetric(QScrollerProperties::MaximumVelocity, 0.5); | |
| QScroller::scroller(viewport())->setScrollerProperties(sp); | |
| } | |
| // 支持在触摸屏上滚动 | |
| constexpr qreal kTouchScrollDecelerationFactor = 0.5; // Tunable: see Qt docs for recommended ranges | |
| constexpr qreal kTouchScrollMaximumVelocity = 0.5; // Tunable: see Qt docs for recommended ranges | |
| QScroller::grabGesture(viewport(), QScroller::TouchGesture); | |
| QScroller *scroller = QScroller::scroller(viewport()); | |
| QScrollerProperties sp = scroller->scrollerProperties(); | |
| sp.setScrollMetric(QScrollerProperties::VerticalOvershootPolicy, QScrollerProperties::OvershootAlwaysOff); | |
| sp.setScrollMetric(QScrollerProperties::HorizontalOvershootPolicy, QScrollerProperties::OvershootAlwaysOff); | |
| sp.setScrollMetric(QScrollerProperties::DecelerationFactor, kTouchScrollDecelerationFactor); | |
| sp.setScrollMetric(QScrollerProperties::MaximumVelocity, kTouchScrollMaximumVelocity); | |
| scroller->setScrollerProperties(sp); | |
| } |
net-view/window/netview.cpp
Outdated
support scroll on touch screen PMS: BUG-351259
deepin pr auto review这段代码的修改主要是为了在 1. 语法逻辑
2. 代码质量
3. 代码性能
4. 代码安全
改进后的代码示例// SPDX-FileCopyrightText: 2019 - 2026 UnionTech Software Technology Co., Ltd.
//
// SPDX-License-Identifier: LGPL-3.0-or-later
#include "netview.h"
// ... 其他头文件 ...
NetView::NetView(NetManager *manager)
: DListView(manager)
, m_manager(manager)
{
// ... 其他初始化代码 ...
connect(this, &NetView::activated, this, &NetView::onActivated);
// 配置触摸屏滚动参数
configureTouchScrolling();
}
void NetView::configureTouchScrolling()
{
// 启用触摸手势
QScroller::grabGesture(viewport(), QScroller::TouchGesture);
// 获取并配置滚动属性
QScroller *scroller = QScroller::scroller(viewport());
if (!scroller) {
qWarning() << "Failed to get QScroller for viewport";
return;
}
QScrollerProperties scrollerProperties = scroller->scrollerProperties();
scrollerProperties.setScrollMetric(QScrollerProperties::VerticalOvershootPolicy, QScrollerProperties::OvershootAlwaysOff);
scrollerProperties.setScrollMetric(QScrollerProperties::HorizontalOvershootPolicy, QScrollerProperties::OvershootAlwaysOff);
scrollerProperties.setScrollMetric(QScrollerProperties::DecelerationFactor, 0.5);
scrollerProperties.setScrollMetric(QScrollerProperties::MaximumVelocity, 0.5);
scroller->setScrollerProperties(scrollerProperties);
}总结
这些改进可以提升代码的可维护性、安全性和性能。 |
|
[APPROVALNOTIFIER] This PR is NOT APPROVED This pull-request has been approved by: caixr23, ut003640 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 |
|
merge |
|
/merge |
support scroll on touch screen
PMS: BUG-351259
Summary by Sourcery
Bug Fixes: