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);
相关推荐
星空椰12 小时前
Python 面向对象高级:继承与类定义详解
开发语言·python
白露与泡影13 小时前
2026大厂Java面试题大全!牛客网最新版
java·开发语言
凯瑟琳.奥古斯特13 小时前
高阶子查询题目精炼
开发语言·数据库·python·职场和发展·数据库开发
雪度娃娃13 小时前
转向现代C++——在意为改写的函数添加 override
开发语言·c++
喵星人工作室14 小时前
C++火影忍者1.1.2
开发语言·c++
basketball61614 小时前
C++ 中的 ptrdiff_t 详解
开发语言·c++
月亮邮递员61615 小时前
Markdown语法总结
开发语言·前端·javascript
printfLILEI15 小时前
php中的类与对象以及反序列化
linux·开发语言·php
曹牧15 小时前
C#:主线程能够捕获到子线程中的异常
开发语言·数据库·c#
代码中介商15 小时前
深入解析STL中的stack、queue与priority_queue
开发语言·c++