QScroller Class
QScroller 类可为任何滚动控件或图形元素启用惯性滚动。更多内容...
| 头文件: | #include <QScroller> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS Widgets) target_link_libraries(mytarget PRIVATE Qt6::Widgets) |
| qmake: | QT += widgets |
| 继承自: | QObject |
公共类型
| enum | Input { InputPress, InputMove, InputRelease } |
| enum | ScrollerGestureType { TouchGesture, LeftMouseButtonGesture, MiddleMouseButtonGesture, RightMouseButtonGesture } |
| enum | State { Inactive, Pressed, Dragging, Scrolling } |
属性
- scrollerProperties : QScrollerProperties
- state : State
公共函数
| QPointF | finalPosition() const |
| bool | handleInput(QScroller::Input input, const QPointF &position, qint64 timestamp = 0) |
| QPointF | pixelPerMeter() const |
| QScrollerProperties | scrollerProperties() const |
| void | setSnapPositionsX(const QList<qreal> &positions) |
| void | setSnapPositionsX(qreal first, qreal interval) |
| void | setSnapPositionsY(const QList<qreal> &positions) |
| void | setSnapPositionsY(qreal first, qreal interval) |
| QScroller::State | state() const |
| void | stop() |
| QObject * | target() const |
| QPointF | velocity() const |
公共槽
| void | ensureVisible(const QRectF &rect, qreal xmargin, qreal ymargin) |
| void | ensureVisible(const QRectF &rect, qreal xmargin, qreal ymargin, int scrollTime) |
| void | resendPrepareEvent() |
| void | scrollTo(const QPointF &pos) |
| void | scrollTo(const QPointF &pos, int scrollTime) |
| void | setScrollerProperties(const QScrollerProperties &prop) |
信号
| void | scrollerPropertiesChanged(const QScrollerProperties &newProperties) |
| void | stateChanged(QScroller::State newState) |
静态公共成员
| QList<QScroller *> | activeScrollers() |
| Qt::GestureType | grabGesture(QObject *target, QScroller::ScrollerGestureType scrollGestureType = TouchGesture) |
| Qt::GestureType | grabbedGesture(QObject *target) |
| bool | hasScroller(QObject *target) |
| QScroller * | scroller(QObject *target) |
| const QScroller * | scroller(const QObject *target) |
| void | ungrabGesture(QObject *target) |
详细说明
借助动能滚动,用户可以朝指定方向推动控件,控件将持续沿此方向滚动,直到被用户停止或受摩擦力制止。可以通过调整惯性、摩擦力及其他物理参数,来优化直观的用户体验。
QScroller 对象用于存储当前位置和滚动速度,并负责处理更新。QScroller 可以通过轻扫手势
,或像这样直接触发:
QWidget *w = ...;
QScroller *scroller = QScroller::scroller(w);
scroller->scrollTo(QPointF(100, 100));被滚动的 QObject 对象会在滚动器需要更新其几何信息时收到QScrollPrepareEvent 事件,并在对象内容实际需要滚动时收到QScrollEvent 事件。
滚动器使用全局QAbstractAnimation 定时器来生成其QScrollEvents。可以通过QScrollerProperties::FrameRate 针对每个QScroller单独更改此设置。
尽管该动能滚动器通过 `QScrollerProperties` 提供了大量设置选项,但我们建议您将所有设置均保留为默认的、针对平台优化的值。在更改这些设置之前,您可以先尝试 `scroller ` 示例目录中的 `plot ` 示例。
另请参阅 QScrollEvent 、QScrollPrepareEvent 以及QScrollerProperties 。
成员类型文档
enum QScroller::Input
该枚举包含与输入设备无关的输入事件视图,这些事件与QScroller 相关。
| 常量 | 值 | 描述 |
|---|---|---|
QScroller::InputPress | 1 | 用户按下了输入设备(例如QEvent::MouseButtonPress 、QEvent::GraphicsSceneMousePress 、QEvent::TouchBegin ) |
QScroller::InputMove | 2 | 用户移动了输入设备(例如:QEvent::MouseMove 、QEvent::GraphicsSceneMouseMove 、QEvent::TouchUpdate ) |
QScroller::InputRelease | 3 | 用户松开了输入设备(例如:QEvent::MouseButtonRelease 、QEvent::GraphicsSceneMouseRelease 、QEvent::TouchEnd ) |
enum QScroller::ScrollerGestureType
该枚举包含QScroller 手势识别器支持的各种手势类型。
| 常量 | 值 | 描述 |
|---|---|---|
QScroller::TouchGesture | 0 | 手势识别器仅在触摸事件发生时触发。具体来说,在使用触摸屏时,它会对单点触摸做出反应;在使用触摸板时,则会对双点触摸做出反应。 |
QScroller::LeftMouseButtonGesture | 1 | 手势识别器仅在鼠标左键事件时触发。 |
QScroller::MiddleMouseButtonGesture | 3 | 手势识别器仅在鼠标中键事件时触发。 |
QScroller::RightMouseButtonGesture | 2 | 手势识别器仅在鼠标右键事件触发时生效。 |
enum QScroller::State
该枚举包含QScroller 的各种状态。
| 常量 | 值 | 描述 |
|---|---|---|
QScroller::Inactive | 0 | 滚动条未滚动,且未按下任何按键。 |
QScroller::Pressed | 1 | 已收到触摸事件或鼠标按钮已被按下,但滚动区域当前未被拖动。 |
QScroller::Dragging | 2 | 滚动区域当前正在跟随触摸点或鼠标移动。 |
QScroller::Scrolling | 3 | 滚动区域正在自行移动。 |
属性文档
scrollerProperties : QScrollerProperties
该属性保存了此滚动条的属性。QScroller 会使用这些属性来确定其滚动行为。
访问函数:
| QScrollerProperties | scrollerProperties() const |
| void | setScrollerProperties(const QScrollerProperties &prop) |
通知器信号:
| void | scrollerPropertiesChanged(const QScrollerProperties &newProperties) |
[read-only] state : State
该属性存储了滚动条的状态
访问函数:
| QScroller::State | state() const |
通知器信号:
| void | stateChanged(QScroller::State newState) |
另请参阅 QScroller::State 。
成员函数文档
[static] QList<QScroller *> QScroller::activeScrollers()
返回一个包含当前应用程序中所有处于活动状态的QScroller 对象的列表。处于活动状态的QScroller 对象位于一个state()中,且该状态未被QScroller::Inactive 。在编写自定义手势识别器时,此函数非常有用。
[slot] void QScroller::ensureVisible(const QRectF &rect, qreal xmargin, qreal ymargin)
开始滚动,使矩形rect 显示在视口内,并在该矩形周围添加由xmargin 和ymargin 指定的以像素为单位的额外边距。
如果无法将矩形及其边距全部容纳在视口内,则会滚动内容,以便尽可能多地显示rect 中的内容。
滚动速度经过计算,确保在平台定义的时间间隔后到达指定位置。
此函数通过调用scrollTo() 来执行实际的滚动操作。
注意:此 插槽是重载的。要连接到此插槽:
// Connect using qOverload:
connect(sender, &SenderClass::signal,
scroller, qOverload(&QScroller::ensureVisible));
// Or using a lambda as wrapper:
connect(sender, &SenderClass::signal,
scroller, [receiver = scroller](const QRectF &rect, qreal xmargin, qreal ymargin) { receiver->ensureVisible(rect, xmargin, ymargin); }); 另请参阅 scrollTo()。
[slot] void QScroller::ensureVisible(const QRectF &rect, qreal xmargin, qreal ymargin, int scrollTime)
该版本将在scrollTime 毫秒内到达目标位置。
注意:此 插槽已被重载。要连接到此插槽:
// Connect using qOverload:
connect(sender, &SenderClass::signal,
scroller, qOverload(&QScroller::ensureVisible));
// Or using a lambda as wrapper:
connect(sender, &SenderClass::signal,
scroller, [receiver = scroller](const QRectF &rect, qreal xmargin, qreal ymargin, int scrollTime) { receiver->ensureVisible(rect, xmargin, ymargin, scrollTime); }); QPointF QScroller::finalPosition() const
返回当前滚动操作的预估最终位置。如果滚动条状态不是“Scrolling”,则返回当前位置。当滚动条状态为“Inactive”时,结果未定义。
目标位置以像素为单位。
另请参阅 pixelPerMeter() 和scrollTo()。
[static] Qt::GestureType QScroller::grabGesture(QObject *target, QScroller::ScrollerGestureType scrollGestureType = TouchGesture)
注册一个自定义滚动手势识别器,将其绑定到target 上,并返回生成的手势类型。如果scrollGestureType 设置为TouchGesture ,则手势在触摸事件发生时触发;如果设置为LeftMouseButtonGesture 、RightMouseButtonGesture 或MiddleMouseButtonGesture 中的任意一个,则在相应按钮的鼠标事件发生时触发。
单个对象上同一时间只能有一个滚动手势处于活动状态。若对同一对象调用此函数两次,系统会先释放现有手势,然后捕获新手势。
注意:为 避免意外副作用,在手势触发期间会消耗鼠标事件。由于初始的鼠标按下事件并未被消耗,因此该手势会在全局坐标(INT_MIN, INT_MIN) 处发送一个模拟的鼠标释放事件。这可确保接收原始鼠标按下事件的控件的内部状态保持一致。
另请参阅 ungrabGesture() 和grabbedGesture()。
[static] Qt::GestureType QScroller::grabbedGesture(QObject *target)
返回target 当前捕获的手势类型;如果未捕获任何手势,则返回0。
另请参阅 grabGesture() 和ungrabGesture()。
bool QScroller::handleInput(QScroller::Input input, const QPointF &position, qint64 timestamp = 0)
该函数由手势识别器调用,用于向滚动器通知新的输入事件。滚动器会根据输入事件及其关联的滚动器属性,相应地修改其内部的state()方法。滚动器不会区分事件来自何种输入设备。 因此,该事件需要拆分为以下三部分:input 类型、position 以及毫秒单位timestamp 。position 必须位于目标的坐标系中。
如果事件应由调用该过滤器的过滤器处理,则返回值为true ;如果事件应转发给控件,则返回值为false 。
注意: 对于大多数用例,使用 grabGesture() 通常就足够了。
[static] bool QScroller::hasScroller(QObject *target)
如果已为target 创建了QScroller 对象,则返回true ;否则返回false 。
另请参阅 scroller()。
QPointF QScroller::pixelPerMeter() const
返回已滚动控件的“每米像素”指标。
该值通过QPointF 分别报告 x 轴和 y 轴的数值。
注意:请 注意,该值在物理意义上应是正确的。底层窗口系统(例如在 macOS 上)可能会故意错误地报告 Qt 为显示屏返回的实际 DPI 设置。
[slot] void QScroller::resendPrepareEvent()
该函数会重新发送QScrollPrepareEvent 。调用resendPrepareEvent会触发滚动器发出的QScrollPrepareEvent 。这允许接收方在滚动过程中重新设置内容位置和内容大小。在“非活动”状态下调用此函数是无效的,因为在滚动开始之前,准备事件会被重新发送。
[slot] void QScroller::scrollTo(const QPointF &pos)
开始滚动该控件,使点pos 位于视口左上角。
当滚动超出有效滚动区域时,其行为未定义。在此情况下,滚动条可能会或可能不会越界。
滚动速度将经过计算,以确保在平台定义的时间间隔后到达给定位置。
pos 以视口坐标形式给出。
注意:此 插槽已被重载。要连接到此插槽:
// Connect using qOverload:
connect(sender, &SenderClass::signal,
scroller, qOverload(&QScroller::scrollTo));
// Or using a lambda as wrapper:
connect(sender, &SenderClass::signal,
scroller, [receiver = scroller](const QPointF &pos) { receiver->scrollTo(pos); }); 另请参阅 ensureVisible()。
[slot] void QScroller::scrollTo(const QPointF &pos, int scrollTime)
该版本将在scrollTime 毫秒内到达目标位置。
注意:此 插槽已被重载。要连接到此插槽:
// Connect using qOverload:
connect(sender, &SenderClass::signal,
scroller, qOverload(&QScroller::scrollTo));
// Or using a lambda as wrapper:
connect(sender, &SenderClass::signal,
scroller, [receiver = scroller](const QPointF &pos, int scrollTime) { receiver->scrollTo(pos, scrollTime); }); [static] QScroller *QScroller::scroller(QObject *target)
返回给定 `target` 对应的滚动条。只要该对象存在,此函数将始终返回同一个 `QScroller ` 实例。如果该 `target` 不存在 `QScroller `,则会隐式创建一个。在任何时候,一个对象上都不会有超过一个 `QScroller ` 处于活动状态。
另请参阅 hasScroller() 和target()。
[static] const QScroller *QScroller::scroller(const QObject *target)
这是 scroller() 的 const 版本。
这是一个重载函数。
[signal] void QScroller::scrollerPropertiesChanged(const QScrollerProperties &newProperties)
QScroller 每当其滚动条属性发生变化时,都会发出此信号。newProperties 是新的滚动条属性。
注意: 属性scrollerProperties的通知器 信号。
另请参阅 scrollerProperties 。
void QScroller::setSnapPositionsX(const QList<qreal> &positions)
将水平轴的对齐位置设置为一个positions 列表。这将覆盖所有先前设置的对齐位置以及先前设置的对齐间隔。通过设置一个空的位置列表,可以禁用对齐功能。
void QScroller::setSnapPositionsX(qreal first, qreal interval)
将水平轴的对齐位置设置为等间距。第一个对齐位置为first ,下一个为first +interval 。这可用于实现列表标题。此设置将覆盖之前设置的所有对齐位置以及之前设置的对齐间隔。将间隔设置为0.0可禁用对齐功能。
void QScroller::setSnapPositionsY(const QList<qreal> &positions)
将垂直轴的对齐位置设置为一个positions 列表。这将覆盖之前设置的所有对齐位置以及之前设置的对齐间隔。通过设置一个空的位置列表,可以禁用对齐功能。
void QScroller::setSnapPositionsY(qreal first, qreal interval)
将垂直轴的对齐位置设置为等间距。第一个对齐位置为first 。下一个为first +interval 。这将覆盖所有先前设置的对齐位置以及先前设置的对齐间距。将间距设置为0.0可禁用对齐功能。
[signal] void QScroller::stateChanged(QScroller::State newState)
QScroller 每当状态发生变化时,都会发出此信号。newState 是新的状态。
注意: 属性state的通知器 信号。
另请参阅 state 。
void QScroller::stop()
停止滚动条,并将其状态重置为“非活动”状态。
QObject *QScroller::target() const
返回此滚动条的目标对象。
另请参阅 hasScroller() 和scroller()。
[static] void QScroller::ungrabGesture(QObject *target)
释放target 的手势。如果未捕获任何手势,则不执行任何操作。
另请参阅 grabGesture() 和grabbedGesture()。
QPointF QScroller::velocity() const
当状态为“滚动”或“拖动”时,返回当前的滚动速度(单位为米/秒)。否则,返回零速度。
通过调用 `QPointF` 方法,可分别获取 x 轴和 y 轴的速度。
另请参阅 pixelPerMeter()。
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.