Header:#include < QScroller >
qmake:QT += widgets
Since:Qt 5.0
Inherits:QObject
This class was introduced in Qt 5.0.
Public Types
enum Input { InputPress, InputMove, InputRelease }
enum ScrollerGestureType { TouchGesture, LeftMouseButtonGesture, MiddleMouseButtonGesture, RightMouseButtonGesture }
enum State { Inactive, Pressed, Dragging, Scrolling }
Properties
scrollerProperties : QScrollerProperties
state : const State
Public Functions
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
Public Slots
void ensureVisible(const QRectF &rect, qreal xmargin, qreal ymargin, int scrollTime)
void ensureVisible(const QRectF &rect, qreal xmargin, qreal ymargin)
void resendPrepareEvent()
void scrollTo(const QPointF &pos, int scrollTime)
void scrollTo(const QPointF &pos)
void setScrollerProperties(const QScrollerProperties &prop)
Signals
void scrollerPropertiesChanged(const QScrollerProperties &newProperties)
void stateChanged(QScroller::State newState)
Static Public Members
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)
Detailed Description
使用动态滚动,用户可以向给定方向推动小部件,它将继续沿着该方向滚动,直到被用户或摩擦停止。可以改变惯性、摩擦和其他物理概念,以微调直观的用户体验。
qscroll对象是存储当前位置和滚动速度并负责更新的对象。qscroll可以通过轻击手势触发
QWidget *w = ...;
QScroller::grabGesture(w, QScroller::LeftMouseButtonGesture);
或者直接像这样:
QWidget *w = ...;
QScroller *scroller = QScroller::scroller(w);
scroller->scrollTo(QPointF(100, 100));
滚动的QObjects在滚动需要更新其几何信息时接收一个QScrollPrepareEvent,在对象的内容需要实际滚动时接收一个QScrollEvent。
滚轮使用全局的QAbstractAnimation计时器来生成它的QScrollEvents。这可以在每个qscroll的基础上使用QScrollerProperties::FrameRate进行更改。
滚动示例目录中的几个示例展示了如何使用QScroller、QScrollEvent和滚动手势。
尽管这个动态滚轮通过QScrollerProperties有大量可用的设置,我们建议您将它们全部保留为默认的平台优化值。在更改它们之前,您可以在滚动示例目录中试用绘图示例。
See also QScrollEvent, QScrollPrepareEvent, and QScrollerProperties.
Member Type Documentation
enum QScroller::Input
该枚举包含与qroller相关的输入事件的输入设备无关视图。
Constant | Value | Description |
---|---|---|
QScroller::InputPress | 1 | The user pressed the input device (e.g. QEvent::MouseButtonPress, QEvent::GraphicsSceneMousePress, QEvent::TouchBegin) |
QScroller::InputMove | 2 | The user moved the input device (e.g. QEvent::MouseMove, QEvent::GraphicsSceneMouseMove, QEvent::TouchUpdate) |
QScroller::InputRelease | 3 | The user released the input device (e.g. QEvent::MouseButtonRelease, QEvent::GraphicsSceneMouseRelease, QEvent::TouchEnd) |
enum QScroller::ScrollerGestureType
此枚举包含qscroll手势识别器支持的不同手势类型。
Constant | Value | Description |
---|---|---|
QScroller::TouchGesture | 0 | 手势识别器只会在触摸事件时触发。具体来说,当使用触摸屏时,它会在单触点上做出反应,当使用触摸板时,它会在双触点上做出反应。 |
QScroller::LeftMouseButtonGesture | 1 | 手势识别器只会触发鼠标左键事件。 |
QScroller::MiddleMouseButtonGesture | 3 | 手势识别器只会在鼠标中键事件时触发。 |
QScroller::RightMouseButtonGesture | 2 | 手势识别器只会在鼠标右键事件时触发。 |
enum QScroller::State
此枚举包含不同的qscroll状态。
Constant | Value | Description |
---|---|---|
QScroller::Inactive | 0 | 滚轮没有滚动,也没有按下任何东西。 |
QScroller::Pressed | 1 | 收到触摸事件或按下鼠标按钮,但滚动区域当前未被拖动。 |
QScroller::Dragging | 2 | 滚动区域当前跟随触摸点或鼠标。 |
QScroller::Scrolling | 3 | 滚动区域会自己移动。 |
Property Documentation
scrollerProperties : QScrollerProperties
此属性保存此滚轮的滚轮属性。QScroller使用这些属性来确定其滚动行为。
访问函数:
QScrollerProperties scrollerProperties() const
void setScrollerProperties(const QScrollerProperties &prop)
通知信号:
void scrollerPropertiesChanged(const QScrollerProperties &newProperties)
state : const State
此属性保存滚轮的状态
访问函数:
QScroller::State state() const
通知信号:
void stateChanged(QScroller::State newState)
See also QScroller::State.
Member Function Documentation
[slot] void QScroller::ensureVisible(const QRectF &rect, qreal xmargin, qreal ymargin, int scrollTime)
这是一个重载函数。
此版本将在scrollTime毫秒内到达目标位置。
[slot] void QScroller::ensureVisible(const QRectF &rect, qreal xmargin, qreal ymargin)
开始滚动,使矩形矩形在视口中可见,并在矩形周围使用xmargin和ymargin以像素指定附加边距。
如果在viewport内不可能匹配rect +边距,则滚动内容,以便尽可能多地从rect可见。
计算滚动速度,以便在平台定义的时间跨度之后到达给定位置。
这个函数通过调用scrollTo()来执行实际的滚动操作。
See also scrollTo().
[slot] void QScroller::resendPrepareEvent()
这个函数重新发送QScrollPrepareEvent。调用resendPrepareEvent从滚动轮触发QScrollPrepareEvent。
这允许接收者在滚动时重新设置内容位置和内容大小。
在Inactive状态下调用此函数是无用的,因为在滚动开始之前会再次发送prepare事件。
[slot] void QScroller::scrollTo(const QPointF &pos, int scrollTime)
这是一个重载函数。
此版本将在scrollTime毫秒内到达目标位置。
[slot] void QScroller::scrollTo(const QPointF &pos)
开始滚动小部件,使点pos位于视口的左上角。
在有效滚动区域之外滚动时的行为是未定义的。在这种情况下,滚轮可能会或不会超调。
将计算滚动速度,以便在平台定义的时间跨度之后到达给定位置。
Pos在视口坐标中给出。
See also ensureVisible().
[signal] void QScroller::scrollerPropertiesChanged(const QScrollerProperties &newProperties)
每当它的滚轮属性改变时,QScroller都会发出这个信号。newProperties是新的滚动条属性。
注意:属性scrollerProperties的通知器信号。
See also scrollerProperties.
[signal] void QScroller::stateChanged(QScroller::State newState)
每当状态改变时,qscroll都会发出这个信号。newState是新的State。
注意:属性状态的通知器信号。
See also state.
[static] QList<QScroller *> QScroller::activeScrollers()
返回当前活动qscroll对象的应用程序范围列表。活动QScroller对象处于非QScroller::Inactive状态()。这个函数在编写自己的手势识别器时非常有用。
QPointF QScroller::finalPosition() const
返回当前滚动移动的估计最终位置。如果滚轮状态不是滚动状态,则返回当前位置。当滚动条状态为Inactive时,结果是未定义的。
目标位置以像素为单位。
See also pixelPerMeter() and scrollTo().
[static] Qt::GestureType QScroller::grabGesture(QObject *target, QScroller::ScrollerGestureType scrollGestureType = TouchGesture)
注册一个自定义滚动手势识别器,为目标获取它并返回结果手势类型。如果scrollGestureType被设置为TouchGesture,手势会触发触摸事件。如果它被设置为LeftMouseButtonGesture, RightMouseButtonGesture或MiddleMouseButtonGesture中的一个,它将触发相应按钮的鼠标事件。
同一时间,一个对象上只能激活一个滚动手势。如果在同一个对象上调用此函数两次,它将在抓取新手势之前取消抓取现有手势。
注意:为了避免不必要的副作用,在触发手势时消耗鼠标事件。由于初始的鼠标按下事件没有被消耗,手势在全局位置(INT_MIN, INT_MIN)发送一个假的鼠标释放事件。这确保了接收到原始鼠标按压的小部件的内部状态是一致的。
See also ungrabGesture() and grabbedGesture().
[static] Qt::GestureType QScroller::grabbedGesture(QObject *target)
返回当前为目标抓取的手势类型,如果没有抓取手势则返回0。
See also grabGesture() and ungrabGesture().
bool QScroller::handleInput(QScroller::Input input, const QPointF &position, qint64 timestamp = 0)
这个函数被手势识别器用来通知滚轮一个新的输入事件。滚动条根据输入事件及其附加的滚动条属性改变其内部状态()。滚轮无法区分事件来自哪一种输入设备。因此,需要将事件拆分为输入类型、位置和毫秒时间戳。这个位置需要在目标的坐标系中。
如果事件应由调用过滤器使用,则返回值为true;如果事件应转发到控件,则返回值为false。
注意:对于大多数用例,使用grabGesture()应该是足够的。
[static] bool QScroller::hasScroller(QObject *target)
如果QScroller对象已经为target创建,则返回true;否则错误。
See also scroller().
QPointF QScroller::pixelPerMeter() const
返回滚动小部件的每米像素度量。
通过使用QPointF分别报告x轴和y轴的值。
注意:请注意,此值应在物理上正确。Qt为显示返回的实际DPI设置可能被底层窗口系统故意错误地报告,例如在macOS上。
[static] QScroller *QScroller::scroller(QObject *target)
返回给定目标的滚轮。只要对象存在,此函数将始终返回相同的qroller实例。如果目标不存在qscroll,则将隐式地创建一个。在任何情况下,一个对象上都不能有多个qscroll处于活动状态。
See also hasScroller() and target().
[static] const QScroller *QScroller::scroller(const QObject *target)
这是一个重载函数。
这是scroller()的const版本。
void QScroller::setSnapPositionsX(const QList<qreal> &positions)
将水平轴的快照位置设置为位置列表。这将覆盖所有先前设置的捕获位置以及先前设置的捕获间隔。可以通过设置一个空的位置列表来禁用捕捉。
void QScroller::setSnapPositionsX(qreal first, qreal interval)
将水平轴的快照位置设置为规则间隔。第一个抓拍位置是在第一。
下一个在第一个+间隔。这可以用来实现一个列表头。
这将覆盖所有先前设置的捕获位置以及先前设置的捕获间隔。可以通过将间隔设置为0.0来停用捕捉
void QScroller::setSnapPositionsY(const QList<qreal> &positions)
将垂直轴的快照位置设置为位置列表。
这将覆盖所有先前设置的捕获位置以及先前设置的捕获间隔。
可以通过设置一个空的位置列表来禁用捕捉。
void QScroller::setSnapPositionsY(qreal first, qreal interval)
将垂直轴的快照位置设置为规则间隔。第一个抓拍位置是在第一。
下一个在第一个+间隔。这将覆盖所有先前设置的捕获位置以及先前设置的捕获间隔。
可以通过将间隔设置为0.0来停用捕捉
void QScroller::stop()
停止滚轮并将其状态重置为非活动状态。
QObject *QScroller::target() const
返回此滚轮的目标对象。
See also hasScroller() and scroller().
[static] void QScroller::ungrabGesture(QObject *target)
松开目标的手势。如果没有手势被抓取,则不执行任何操作。
See also grabGesture() and grabbedGesture().
QPointF QScroller::velocity() const
当状态为“滚动”或“拖动”时,返回当前以米/秒为单位的滚动速度。否则返回零速度。
通过使用QPointF分别报告x轴和y轴的速度。
See also pixelPerMeter().