Qt惯性动画效果

QScrollArea中自定义滚动效果

复制代码
  ui->scrollArea->viewport();
    // 开启触摸支持(车载触摸屏必开)
     ui->scrollArea->setAttribute(Qt::WA_AcceptTouchEvents, true);
    // ui->scrollArea->grabGesture();
     // 错误的做法:对 QScrollArea 整体进行手势抓取
     // QScroller::grabGesture(scrollArea, QScroller::TouchGesture);

     // 正确的做法:对 QScrollArea 的视口(Viewport)进行手势抓取
     // 这会确保滚动应用于内部的内容
     QScroller::grabGesture(ui->scrollArea->viewport(), QScroller::TouchGesture);

     QScroller::grabGesture(ui->scrollArea->viewport(), QScroller::LeftMouseButtonGesture);

     // 使用 QScroller::scroller() 获取并设置属性
      QScroller *scroller = QScroller::scroller(ui->scrollArea->viewport());
     // 如果你想关闭内容拖拽到边界外的"弹性/回弹"效果,可以设置 OvershootPolicy
     QScrollerProperties properties = scroller->scrollerProperties();
     properties.setScrollMetric(QScrollerProperties::VerticalOvershootPolicy,
                                QVariant::fromValue(QScrollerProperties::OvershootAlwaysOn));
     properties.setScrollMetric(QScrollerProperties::HorizontalOvershootPolicy,
                                QVariant::fromValue(QScrollerProperties::OvershootAlwaysOff));

     // ========== 车载HMI适配:调整回弹手感(关键属性)==========
\
     // properties.setScrollMetric(QScrollerProperties::Friction, 0.8); // 滚动摩擦力(0.8~1.0,跟手不卡顿)
     properties.setScrollMetric(QScrollerProperties::MaximumVelocity, 1200); // 最大滚动速度(适配车载触摸屏)
     properties.setScrollMetric(QScrollerProperties::OvershootScrollTime, 0.3);             // 回弹时长300ms
     properties.setScrollMetric(QScrollerProperties::OvershootDragResistanceFactor, 0.3);    // 核心:回弹软硬度(越小越软,车载推荐0.1~0.2)
     properties.setScrollMetric(QScrollerProperties::OvershootDragDistanceFactor, 0.15);    // 超界拖动幅度  超界拖动距离(车载推荐0.1~0.2)
     properties.setScrollMetric(QScrollerProperties::OvershootScrollDistanceFactor, 0.2);   // 回弹距离 回弹滚动距离(车载推荐0.2)
     properties.setScrollMetric(QScrollerProperties::OvershootScrollTime, 0.6);             // 回弹时长600ms

     // ========== 滚动摩擦力/速度(对应QML friction)==========
     properties.setScrollMetric(QScrollerProperties::DecelerationFactor, 0.15);             // 等效friction=0.8
     properties.setScrollMetric(QScrollerProperties::MaximumVelocity, 1.2);                 // 最大滚动速度1.2m/s  最大滚动速度(适配车载触摸屏)
     properties.setScrollMetric(QScrollerProperties::MinimumVelocity, 0.01);                // 最小滚动速度
     properties.setScrollMetric(QScrollerProperties::MaximumClickThroughVelocity, 0.5);     // 点击穿透阈值

     // ========== 手势触发配置(车载适配)==========
     properties.setScrollMetric(QScrollerProperties::DragStartDistance, 0.005);             // 5px触发滚动
     properties.setScrollMetric(QScrollerProperties::MousePressEventDelay, 0.0);            // 触摸屏无延迟
     properties.setScrollMetric(QScrollerProperties::DragVelocitySmoothingFactor, 0.8);     // 速度平滑

     // ========== 其他优化(车载必配)==========
     properties.setScrollMetric(QScrollerProperties::ScrollingCurve, QEasingCurve::OutCubic); // 平滑滚动曲线
     properties.setScrollMetric(QScrollerProperties::FrameRate, QScrollerProperties::Fps60); // 60fps

     scroller->setScrollerProperties(properties);
相关推荐
CHHH_HHH6 分钟前
【Linux系统篇】深入解析Linux文件系统:从磁盘寻址到软硬链接
linux·服务器·开发语言·后端·ubuntu
yngsqq14 分钟前
窗体快速取消
java·开发语言
XiaQ091942 分钟前
Linux 常用命令学习笔记(用户管理篇):用户、组与权限的钥匙
linux·开发语言·笔记·学习
不可求~1 小时前
C++ 报错交给 AI 之前,先准备好这 8 类信息
开发语言·c++·人工智能
名字还没想好☜1 小时前
用 Python struct 解析二进制协议:pack/unpack、字节序与对齐踩坑
开发语言·python·二进制·struct
一知半解仙1 小时前
当机器人学会泛化,而我在写Java:一名后端开发者的2026年8月21日观察手记
java·开发语言·机器人
青 春 记 忆2 小时前
LeetCode 155. 最小栈|Python 解法详解
开发语言·python·leetcode
剩下了什么10 小时前
float32 与 float64 精度陷阱:如何在 Go 中避免错误使用
开发语言·后端·golang
指尖时光.11 小时前
Three.js 超全入门综合案例
开发语言·javascript·ecmascript
暴力求解11 小时前
Linux网络---传输层协议TCP(二)
linux·服务器·开发语言·网络·tcp/ip