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);
相关推荐
Felix_One4 天前
Qt 串口通信避坑指南:QSerialPort 的 5 个常见问题
qt
blasit7 天前
笔记:Qt C++建立子线程做一个socket TCP常连接通信
c++·qt·tcp/ip
郑州光合科技余经理11 天前
代码展示:PHP搭建海外版外卖系统源码解析
java·开发语言·前端·后端·系统架构·uni-app·php
feifeigo12311 天前
matlab画图工具
开发语言·matlab
dustcell.11 天前
haproxy七层代理
java·开发语言·前端
norlan_jame11 天前
C-PHY与D-PHY差异
c语言·开发语言
多恩Stone11 天前
【C++入门扫盲1】C++ 与 Python:类型、编译器/解释器与 CPU 的关系
开发语言·c++·人工智能·python·算法·3d·aigc
QQ40220549611 天前
Python+django+vue3预制菜半成品配菜平台
开发语言·python·django
遥遥江上月11 天前
Node.js + Stagehand + Python 部署
开发语言·python·node.js
m0_5312371711 天前
C语言-数组练习进阶
c语言·开发语言·算法