QScroller Class

QScroller 类可让任何滚动部件或图形项实现动态滚动。更多

Header: #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 }

属性

公共功能

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)

详细说明

通过动能滚动,用户可以将 widget 推向给定方向,它将继续向该方向滚动,直到用户或摩擦力阻止它为止。可以改变惯性、摩擦力和其他物理概念,以微调直观的用户体验。

QScroller 对象存储当前位置和滚动速度,并负责更新。QScroller 可以通过轻触手势触发

    QWidget *w = ...;
    QScroller::grabGesture(w, QScroller::LeftMouseButtonGesture);

或像这样直接触发:

    QWidget *w = ...;
    QScroller *scroller = QScroller::scroller(w);
    scroller->scrollTo(QPointF(100, 100));

每当滚动器需要更新几何信息时,滚动的 QObjects 就会收到QScrollPrepareEvent ;每当对象的内容需要实际滚动时,滚动的 QObjects 就会收到QScrollEvent

滚动器使用全局QAbstractAnimation 定时器来生成 QScrollEvents。可通过QScrollerProperties::FrameRate 根据每个 QScroller 的情况进行更改。

尽管通过QScrollerProperties 可以对该动态滚动器进行大量设置,但我们建议您将其全部保留为默认的平台优化值。在更改这些设置之前,您可以使用scroller 示例目录中的plot 示例进行实验。

另请参阅 QScrollEventQScrollPrepareEventQScrollerProperties

成员类型文档

enum QScroller::Input

该枚举包含与输入设备无关的输入事件视图,适用于QScroller

常量说明
QScroller::InputPress1用户按下输入设备(例如QEvent::MouseButtonPress,QEvent::GraphicsSceneMousePress,QEvent::TouchBegin)
QScroller::InputMove2用户移动输入设备(如QEvent::MouseMove,QEvent::GraphicsSceneMouseMove,QEvent::TouchUpdate)
QScroller::InputRelease3用户释放输入设备(例如:QEvent::MouseButtonRelease,QEvent::GraphicsSceneMouseRelease,QEvent::TouchEnd)

enum QScroller::ScrollerGestureType

该枚举包含QScroller 手势识别器支持的不同手势类型。

常量描述
QScroller::TouchGesture0手势识别器只会在触摸事件中触发。具体来说,使用触摸屏时,它将对单点触摸做出反应;使用触摸板时,它将对双点触摸做出反应。
QScroller::LeftMouseButtonGesture1手势识别器只会在鼠标左键事件时触发。
QScroller::MiddleMouseButtonGesture3手势识别器只会在鼠标中键事件时触发。
QScroller::RightMouseButtonGesture2手势识别器只会在鼠标右键事件时触发。

enum QScroller::State

该枚举包含不同的QScroller 状态。

常量说明
QScroller::Inactive0滚动器未滚动,也未按下任何按钮。
QScroller::Pressed1接收到触摸事件或按下鼠标按钮,但当前未拖动滚动区域。
QScroller::Dragging2滚动区域正在跟随触摸点或鼠标移动。
QScroller::Scrolling3滚动区域正在自行移动。

属性文档

scrollerProperties : QScrollerProperties

此属性保存此滚动器的滚动属性。QScroller 使用这些属性来决定其滚动行为。

访问功能:

QScrollerProperties scrollerProperties() const
void setScrollerProperties(const QScrollerProperties &prop)

通知信号:

void scrollerPropertiesChanged(const QScrollerProperties &newProperties)

[read-only] state : const State

此属性保存滚动条的状态

访问功能:

QScroller::State state() const

通知信号:

void stateChanged(QScroller::State newState)

另请参阅 QScroller::State

成员函数文档

[static] QList<QScroller *> QScroller::activeScrollers()

返回当前活动QScroller 对象的应用程序范围列表。活动的QScroller 对象位于非QScroller::Inactivestate() 中。该函数在编写自己的手势识别器时非常有用。

[slot] void QScroller::ensureVisible(const QRectF &rect, qreal xmargin, qreal ymargin)

开始滚动,使rect 矩形在视口中可见,并在矩形周围留出xmarginymargin 指定的额外边距(以像素为单位)。

如果无法将矩形加上边距放入视口中,则会滚动内容,以便从rect 看到尽可能多的内容。

滚动速度经过计算,在平台定义的时间跨度内到达指定位置。

该函数通过调用scrollTo() 来执行实际滚动。

另请参见 scrollTo()。

[slot] void QScroller::ensureVisible(const QRectF &rect, qreal xmargin, qreal ymargin, int scrollTime)

这是一个重载函数。

该版本将在scrollTime 毫秒内到达目的地位置。

QPointF QScroller::finalPosition() const

返回当前滚动运动的估计最终位置。如果滚动器状态不是滚动,则返回当前位置。如果滚动条状态为非活动,则结果未定义。

目标位置以像素为单位。

另请参阅 pixelPerMeter() 和scrollTo()。

[static] Qt::GestureType QScroller::grabGesture(QObject *target, QScroller::ScrollerGestureType scrollGestureType = TouchGesture)

注册自定义滚动手势识别器,抓取target 并返回生成的手势类型。如果scrollGestureType 设置为TouchGesture ,手势会在触摸事件中触发。如果设置为LeftMouseButtonGestureRightMouseButtonGestureMiddleMouseButtonGesture ,则会在相应按钮的鼠标事件中触发。

一个对象上同时只能激活一个滚动手势。如果在同一对象上调用该函数两次,则会在抓取新手势前取消抓取现有手势。

注: 为避免不必要的副作用,在触发手势时会消耗鼠标事件。由于初始鼠标按下事件不会被消耗,手势会在全局位置(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 和毫秒timestampposition 需要位于目标的坐标系中。

如果事件应由调用过滤器处理,则返回值为true ;如果事件应转发给控件,则返回值为false

注: 使用grabGesture() 就能满足大多数使用要求。

[static] bool QScroller::hasScroller(QObject *target)

如果已经为target 创建了QScroller 对象,则返回true ;否则返回false

另请参阅 scroller().

QPointF QScroller::pixelPerMeter() const

返回滚动部件的每米像素指标。

该值通过QPointF 分别报告 x 轴和 y 轴。

注: 请注意,该值在物理上应该是正确的。Qt 为显示屏返回的实际 DPI 设置可能会被底层窗口系统故意错误报告,例如在 macOS 上。

[slot] void QScroller::resendPrepareEvent()

此函数重新发送QScrollPrepareEvent 。调用 resendPrepareEvent 会触发滚动器的QScrollPrepareEvent 。这允许接收者在滚动时重新设置内容位置和内容大小。在非活动状态下调用此函数是无用的,因为准备事件会在滚动开始前再次发送。

[slot] void QScroller::scrollTo(const QPointF &pos)

开始滚动 widget,使pos 点位于视口中的左上角位置。

在有效滚动区域外滚动时的行为未定义。在这种情况下,滚动器可能会超调,也可能不会。

滚动速度将经过计算,以便在平台定义的时间跨度后到达指定位置。

pos 是以视口坐标给出的。

另请参见 ensureVisible()。

[slot] void QScroller::scrollTo(const QPointF &pos, int scrollTime)

这是一个重载函数。

该版本将在scrollTime 毫秒内到达目的地位置。

[static] QScroller *QScroller::scroller(QObject *target)

返回给定target 的滚动器。只要对象存在,该函数将始终返回相同的QScroller 实例。如果target 不存在QScroller ,则将隐式创建一个。在任何时候,一个对象上都不会有一个以上的QScroller 处于活动状态。

另请参阅 hasScroller() 和target()。

[static] const QScroller *QScroller::scroller(const QObject *target)

这是一个重载函数。

这是 scroller() 的常量版本。

[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() 。

© 2025 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.