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);