Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qquickwheelhandler.cpp
Go to the documentation of this file.
1// Copyright (C) 2020 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3// Qt-Security score:significant reason:default
4
7#include <QtQuick/private/qquickitem_p.h>
8#include <QLoggingCategory>
9#include <QtMath>
10
12
13Q_STATIC_LOGGING_CATEGORY(lcWheelHandler, "qt.quick.handler.wheel")
14
15/*!
16 \qmltype WheelHandler
17 \nativetype QQuickWheelHandler
18 \inherits SinglePointHandler
19 \inqmlmodule QtQuick
20 \ingroup qtquick-input-handlers
21 \brief Handler for the mouse wheel.
22
23 WheelHandler is a handler that is used to interactively manipulate some
24 numeric property of an Item as the user rotates the mouse wheel. Like other
25 Input Handlers, by default it manipulates its \l {PointerHandler::target}
26 {target}. Declare \l property to control which target property will be
27 manipulated:
28
29 \snippet pointerHandlers/wheelHandler.qml 0
30
31 \l BoundaryRule is quite useful in combination with WheelHandler (as well
32 as with other Input Handlers) to declare the allowed range of values that
33 the target property can have. For example it is possible to implement
34 scrolling using a combination of WheelHandler and \l DragHandler to
35 manipulate the scrollable Item's \l{QQuickItem::y}{y} property when the
36 user rotates the wheel or drags the item on a touchscreen, and
37 \l BoundaryRule to limit the range of motion from the top to the bottom:
38
39 \snippet pointerHandlers/handlerFlick.qml 0
40
41 Alternatively, if \l property is not set or \l target is null,
42 WheelHandler will not automatically manipulate anything; but the
43 \l rotation property can be used in a binding to manipulate another
44 property, or you can implement \c onWheel and handle the wheel event
45 directly.
46
47 WheelHandler handles only a rotating mouse wheel by default; this
48 can be changed by setting acceptedDevices.
49
50 \sa MouseArea, Flickable, {Qt Quick Examples - Pointer Handlers}
51*/
52
53QQuickWheelHandler::QQuickWheelHandler(QQuickItem *parent)
54 : QQuickSinglePointHandler(*(new QQuickWheelHandlerPrivate), parent)
55{
56 setAcceptedDevices(QInputDevice::DeviceType::Mouse);
57}
58
59/*!
60 \qmlproperty enumeration QtQuick::WheelHandler::orientation
61
62 Which wheel to react to. The default is \c Qt.Vertical.
63
64 Not every mouse has a \c Horizontal wheel; sometimes it is emulated by
65 tilting the wheel sideways. A touchpad can usually generate both vertical
66 and horizontal wheel events.
67*/
68Qt::Orientation QQuickWheelHandler::orientation() const
69{
70 Q_D(const QQuickWheelHandler);
71 return d->orientation;
72}
73
74void QQuickWheelHandler::setOrientation(Qt::Orientation orientation)
75{
76 Q_D(QQuickWheelHandler);
77 if (d->orientation == orientation)
78 return;
79
80 d->orientation = orientation;
81 emit orientationChanged();
82}
83
84/*!
85 \qmlproperty bool QtQuick::WheelHandler::invertible
86
87 Whether or not to reverse the direction of property change if
88 \l QWheelEvent::inverted is \c true. The default is \c true.
89
90 If the operating system has a "natural scrolling" setting that causes
91 scrolling to be in the same direction as the finger movement, then if this
92 property is set to \c true, and WheelHandler is directly setting a property
93 on \l target, the direction of movement will correspond to the system setting.
94 If this property is set to \c false, it will invert the \l rotation so that
95 the direction of motion is always the same as the direction of finger movement.
96*/
97bool QQuickWheelHandler::isInvertible() const
98{
99 Q_D(const QQuickWheelHandler);
100 return d->invertible;
101}
102
103void QQuickWheelHandler::setInvertible(bool invertible)
104{
105 Q_D(QQuickWheelHandler);
106 if (d->invertible == invertible)
107 return;
108
109 d->invertible = invertible;
110 emit invertibleChanged();
111}
112
113/*!
114 \qmlproperty real QtQuick::WheelHandler::activeTimeout
115
116 The amount of time in seconds after which the \l active property will
117 revert to \c false if no more wheel events are received. The default is
118 \c 0.1 (100 ms).
119
120 When WheelHandler handles events that contain
121 \l {Qt::ScrollPhase}{scroll phase} information, such as events from some
122 touchpads, the \l active property will become \c false as soon as an event
123 with phase \l Qt::ScrollEnd is received; in that case the timeout is not
124 necessary. But a conventional mouse with a wheel does not provide a scroll
125 phase: the mouse cannot detect when the user has decided to stop
126 scrolling, so the \l active property transitions to \c false after this
127 much time has elapsed.
128
129 \sa QWheelEvent::phase()
130*/
131qreal QQuickWheelHandler::activeTimeout() const
132{
133 Q_D(const QQuickWheelHandler);
134 return d->activeTimeout;
135}
136
137void QQuickWheelHandler::setActiveTimeout(qreal timeout)
138{
139 Q_D(QQuickWheelHandler);
140 if (qFuzzyCompare(d->activeTimeout, timeout))
141 return;
142
143 if (timeout < 0) {
144 qWarning("activeTimeout must be positive");
145 return;
146 }
147
148 d->activeTimeout = timeout;
149 emit activeTimeoutChanged();
150}
151
152/*!
153 \qmlproperty real QtQuick::WheelHandler::rotation
154
155 The angle through which the mouse wheel has been rotated since the last
156 time this property was set, in wheel degrees.
157
158 A positive value indicates that the wheel was rotated up/right;
159 a negative value indicates that the wheel was rotated down/left.
160
161 A basic mouse click-wheel works in steps of 15 degrees.
162
163 The default is \c 0 at startup. It can be programmatically set to any value
164 at any time. The value will be adjusted from there as the user rotates the
165 mouse wheel.
166
167 \sa orientation
168*/
169qreal QQuickWheelHandler::rotation() const
170{
171 Q_D(const QQuickWheelHandler);
172 return d->rotation * d->rotationScale;
173}
174
175void QQuickWheelHandler::setRotation(qreal rotation)
176{
177 Q_D(QQuickWheelHandler);
178 if (qFuzzyCompare(d->rotation, rotation / d->rotationScale))
179 return;
180
181 d->rotation = rotation / d->rotationScale;
182 emit rotationChanged();
183}
184
185/*!
186 \qmlproperty real QtQuick::WheelHandler::rotationScale
187
188 The scaling to be applied to the \l rotation property, and to the
189 \l property on the \l target item, if any. The default is 1, such that
190 \l rotation will be in units of degrees of rotation. It can be set to a
191 negative number to invert the effect of the direction of mouse wheel
192 rotation.
193*/
194qreal QQuickWheelHandler::rotationScale() const
195{
196 Q_D(const QQuickWheelHandler);
197 return d->rotationScale;
198}
199
200void QQuickWheelHandler::setRotationScale(qreal rotationScale)
201{
202 Q_D(QQuickWheelHandler);
203 if (qFuzzyCompare(d->rotationScale, rotationScale))
204 return;
205 if (qFuzzyIsNull(rotationScale)) {
206 qWarning("rotationScale cannot be set to zero");
207 return;
208 }
209
210 d->rotationScale = rotationScale;
211 emit rotationScaleChanged();
212}
213
214/*!
215 \qmlproperty string QtQuick::WheelHandler::property
216
217 The property to be modified on the \l target when the mouse wheel is rotated.
218
219 The default is no property (empty string). When no target property is being
220 automatically modified, you can use bindings to react to mouse wheel
221 rotation in arbitrary ways.
222
223 You can use the mouse wheel to adjust any numeric property. For example if
224 \c property is set to \c x, the \l target will move horizontally as the
225 wheel is rotated. The following properties have special behavior:
226
227 \value scale
228 \l{QQuickItem::scale}{scale} will be modified in a non-linear fashion
229 as described under \l targetScaleMultiplier. If
230 \l targetTransformAroundCursor is \c true, the \l{QQuickItem::x}{x} and
231 \l{QQuickItem::y}{y} properties will be simultaneously adjusted so that
232 the user will effectively zoom into or out of the point under the mouse
233 cursor.
234 \value rotation
235 \l{QQuickItem::rotation}{rotation} will be set to \l rotation. If
236 \l targetTransformAroundCursor is \c true, the l{QQuickItem::x}{x} and
237 \l{QQuickItem::y}{y} properties will be simultaneously adjusted so
238 that the user will effectively rotate the item around the point under
239 the mouse cursor.
240
241 The adjustment of the given target property is always scaled by \l rotationScale.
242*/
243QString QQuickWheelHandler::property() const
244{
245 Q_D(const QQuickWheelHandler);
246 return d->propertyName;
247}
248
249void QQuickWheelHandler::setProperty(const QString &propertyName)
250{
251 Q_D(QQuickWheelHandler);
252 if (d->propertyName == propertyName)
253 return;
254
255 d->propertyName = propertyName;
256 d->metaPropertyDirty = true;
257 emit propertyChanged();
258}
259
260/*!
261 \qmlproperty real QtQuick::WheelHandler::targetScaleMultiplier
262
263 The amount by which the \l target \l{QQuickItem::scale}{scale} is to be
264 multiplied whenever the \l rotation changes by 15 degrees. This
265 is relevant only when \l property is \c "scale".
266
267 The \c scale will be multiplied by
268 \c targetScaleMultiplier \sup {angleDelta * rotationScale / 15}.
269 The default is \c 2 \sup {1/3}, which means that if \l rotationScale is left
270 at its default value, and the mouse wheel is rotated by one "click"
271 (15 degrees), the \l target will be scaled by approximately 1.25; after
272 three "clicks" its size will be doubled or halved, depending on the
273 direction that the wheel is rotated. If you want to make it double or halve
274 with every 2 clicks of the wheel, set this to \c 2 \sup {1/2} (1.4142).
275 If you want to make it scale the opposite way as the wheel is rotated,
276 set \c rotationScale to a negative value.
277*/
278qreal QQuickWheelHandler::targetScaleMultiplier() const
279{
280 Q_D(const QQuickWheelHandler);
281 return d->targetScaleMultiplier;
282}
283
284void QQuickWheelHandler::setTargetScaleMultiplier(qreal targetScaleMultiplier)
285{
286 Q_D(QQuickWheelHandler);
287 if (qFuzzyCompare(d->targetScaleMultiplier, targetScaleMultiplier))
288 return;
289
290 d->targetScaleMultiplier = targetScaleMultiplier;
291 emit targetScaleMultiplierChanged();
292}
293
294/*!
295 \qmlproperty bool QtQuick::WheelHandler::targetTransformAroundCursor
296
297 Whether the \l target should automatically be repositioned in such a way
298 that it is transformed around the mouse cursor position while the
299 \l property is adjusted. The default is \c true.
300
301 If \l property is set to \c "rotation" and \l targetTransformAroundCursor
302 is \c true, then as the wheel is rotated, the \l target item will rotate in
303 place around the mouse cursor position. If \c targetTransformAroundCursor
304 is \c false, it will rotate around its
305 \l{QQuickItem::transformOrigin}{transformOrigin} instead.
306*/
307bool QQuickWheelHandler::isTargetTransformAroundCursor() const
308{
309 Q_D(const QQuickWheelHandler);
310 return d->targetTransformAroundCursor;
311}
312
313void QQuickWheelHandler::setTargetTransformAroundCursor(bool ttac)
314{
315 Q_D(QQuickWheelHandler);
316 if (d->targetTransformAroundCursor == ttac)
317 return;
318
319 d->targetTransformAroundCursor = ttac;
320 emit targetTransformAroundCursorChanged();
321}
322
323/*!
324 \qmlproperty bool QtQuick::WheelHandler::blocking
325 \since 6.3
326
327 Whether this handler prevents other items or handlers behind it from
328 handling the same wheel event. This property is \c true by default.
329*/
330bool QQuickWheelHandler::isBlocking() const
331{
332 Q_D(const QQuickWheelHandler);
333 return d->blocking;
334}
335
336void QQuickWheelHandler::setBlocking(bool blocking)
337{
338 Q_D(QQuickWheelHandler);
339 if (d->blocking == blocking)
340 return;
341
342 d->blocking = blocking;
343 emit blockingChanged();
344}
345
346bool QQuickWheelHandler::wantsPointerEvent(QPointerEvent *event)
347{
348 if (!event)
349 return false;
350 if (event->type() != QEvent::Wheel)
351 return false;
352 QWheelEvent *we = static_cast<QWheelEvent *>(event);
353 if (!acceptedDevices().testFlag(QPointingDevice::DeviceType::TouchPad)
354 && we->source() != Qt::MouseEventNotSynthesized)
355 return false;
356 if (!active()) {
357 switch (orientation()) {
358 case Qt::Horizontal:
359 if (!(we->angleDelta().x()) && !(we->pixelDelta().x()))
360 return false;
361 break;
362 case Qt::Vertical:
363 if (!(we->angleDelta().y()) && !(we->pixelDelta().y()))
364 return false;
365 break;
366 }
367 }
368 auto &point = event->point(0);
369 if (QQuickPointerDeviceHandler::wantsPointerEvent(event) && wantsEventPoint(event, point) && parentContains(point)) {
370 setPointId(point.id());
371 return true;
372 }
373 return false;
374}
375
376void QQuickWheelHandler::handleEventPoint(QPointerEvent *ev, QEventPoint &point)
377{
378 Q_D(QQuickWheelHandler);
379 QQuickSinglePointHandler::handleEventPoint(ev, point);
380
381 if (ev->type() != QEvent::Wheel)
382 return;
383 const QWheelEvent *event = static_cast<const QWheelEvent *>(ev);
384 setActive(true); // ScrollEnd will not happen unless it was already active (see setActive(false) below)
385 if (d->blocking)
386 point.setAccepted();
387 qreal inversion = !d->invertible && event->isInverted() ? -1 : 1;
388 qreal angleDelta = inversion * qreal(orientation() == Qt::Horizontal ? event->angleDelta().x() :
389 event->angleDelta().y()) / 8;
390 d->rotation += angleDelta;
391 emit rotationChanged();
392
393 d->wheelEvent.reset(event);
394 emit wheel(&d->wheelEvent);
395 if (!d->propertyName.isEmpty() && target()) {
396 QQuickItem *t = target();
397 // writing target()'s property is done via QMetaProperty::write() so that any registered interceptors can react.
398 if (d->propertyName == QLatin1String("scale")) {
399 qreal multiplier = qPow(d->targetScaleMultiplier, angleDelta * d->rotationScale / 15); // wheel "clicks"
400 const QPointF centroidParentPos = t->parentItem()->mapFromScene(point.scenePosition());
401 const QPointF positionWas = t->position();
402 const qreal scaleWas = t->scale();
403 const qreal activePropertyValue = scaleWas * multiplier;
404 qCDebug(lcWheelHandler) << objectName() << "angle delta" << event->angleDelta() << "pixel delta" << event->pixelDelta()
405 << "@" << point.position() << "in parent" << centroidParentPos
406 << "in scene" << point.scenePosition()
407 << "multiplier" << multiplier << "scale" << scaleWas
408 << "->" << activePropertyValue;
409 d->targetMetaProperty().write(t, activePropertyValue);
410 if (d->targetTransformAroundCursor) {
411 // If an interceptor intervened, scale may now be different than we asked for. Adjust accordingly.
412 multiplier = t->scale() / scaleWas;
413 const QPointF adjPos = QQuickItemPrivate::get(t)->adjustedPosForTransform(
414 centroidParentPos, positionWas, QVector2D(), scaleWas, multiplier, t->rotation(), 0);
415 qCDebug(lcWheelHandler) << "adjusting item pos" << adjPos << "in scene" << t->parentItem()->mapToScene(adjPos);
416 t->setPosition(adjPos);
417 }
418 } else if (d->propertyName == QLatin1String("rotation")) {
419 const QPointF positionWas = t->position();
420 const qreal rotationWas = t->rotation();
421 const qreal activePropertyValue = rotationWas + angleDelta * d->rotationScale;
422 const QPointF centroidParentPos = t->parentItem()->mapFromScene(point.scenePosition());
423 qCDebug(lcWheelHandler) << objectName() << "angle delta" << event->angleDelta() << "pixel delta" << event->pixelDelta()
424 << "@" << point.position() << "in parent" << centroidParentPos
425 << "in scene" << point.scenePosition() << "rotation" << t->rotation()
426 << "->" << activePropertyValue;
427 d->targetMetaProperty().write(t, activePropertyValue);
428 if (d->targetTransformAroundCursor) {
429 // If an interceptor intervened, rotation may now be different than we asked for. Adjust accordingly.
430 const QPointF adjPos = QQuickItemPrivate::get(t)->adjustedPosForTransform(
431 centroidParentPos, positionWas, QVector2D(),
432 t->scale(), 1, rotationWas, t->rotation() - rotationWas);
433 qCDebug(lcWheelHandler) << "adjusting item pos" << adjPos << "in scene" << t->parentItem()->mapToScene(adjPos);
434 t->setPosition(adjPos);
435 }
436 } else {
437 qCDebug(lcWheelHandler) << objectName() << "angle delta" << event->angleDelta() << "scaled" << angleDelta
438 << "total" << d->rotation << "pixel delta" << event->pixelDelta()
439 << "@" << point.position() << "in scene" << point.scenePosition() << "rotation" << t->rotation();
440 qreal delta = 0;
441 if (event->hasPixelDelta()) {
442 delta = inversion * d->rotationScale * qreal(orientation() == Qt::Horizontal ? event->pixelDelta().x() : event->pixelDelta().y());
443 qCDebug(lcWheelHandler) << "changing target" << d->propertyName << "by pixel delta" << delta << "from" << event;
444 } else {
445 delta = angleDelta * d->rotationScale;
446 qCDebug(lcWheelHandler) << "changing target" << d->propertyName << "by scaled angle delta" << delta << "from" << event;
447 }
448 bool ok = false;
449 qreal value = d->targetMetaProperty().read(t).toReal(&ok);
450 if (ok)
451 d->targetMetaProperty().write(t, value + qreal(delta));
452 else
453 qWarning() << "failed to read property" << d->propertyName << "of" << t;
454 }
455 }
456 switch (event->phase()) {
457 case Qt::ScrollEnd:
458 qCDebug(lcWheelHandler) << objectName() << "deactivating due to ScrollEnd phase";
459 setActive(false);
460 break;
461 case Qt::NoScrollPhase:
462 d->deactivationTimer.start(qRound(d->activeTimeout * 1000), this);
463 break;
464 case Qt::ScrollBegin:
465 case Qt::ScrollUpdate:
466 case Qt::ScrollMomentum:
467 break;
468 }
469}
470
471void QQuickWheelHandler::onTargetChanged(QQuickItem *oldTarget)
472{
473 Q_UNUSED(oldTarget);
474 Q_D(QQuickWheelHandler);
475 d->metaPropertyDirty = true;
476}
477
478void QQuickWheelHandler::onActiveChanged()
479{
480 Q_D(QQuickWheelHandler);
481 if (!active())
482 d->deactivationTimer.stop();
483}
484
485void QQuickWheelHandler::timerEvent(QTimerEvent *event)
486{
487 Q_D(const QQuickWheelHandler);
488 if (event->timerId() == d->deactivationTimer.timerId()) {
489 qCDebug(lcWheelHandler) << objectName() << "deactivating due to timeout";
490 setActive(false);
491 }
492}
493
494/*!
495 \qmlsignal QtQuick::WheelHandler::wheel(WheelEvent event)
496
497 This signal is emitted every time this handler receives an \a event
498 of type \l QWheelEvent: that is, every time the wheel is moved or the
499 scrolling gesture is updated.
500*/
501
502QQuickWheelHandlerPrivate::QQuickWheelHandlerPrivate()
503 : QQuickSinglePointHandlerPrivate()
504{
505}
506
507QMetaProperty &QQuickWheelHandlerPrivate::targetMetaProperty() const
508{
509 Q_Q(const QQuickWheelHandler);
510 if (metaPropertyDirty && q->target()) {
511 if (!propertyName.isEmpty()) {
512 const QMetaObject *targetMeta = q->target()->metaObject();
513 metaProperty = targetMeta->property(
514 targetMeta->indexOfProperty(propertyName.toLocal8Bit().constData()));
515 }
516 metaPropertyDirty = false;
517 }
518 return metaProperty;
519}
520
521/*! \internal
522 \qmlproperty flags QtQuick::WheelHandler::acceptedButtons
523
524 This overrides QtQuick::PointerDeviceHandler::acceptedButtons
525 and hides it from the documentation as the property is not relevant for
526 WheelHandler.
527*/
528
529/*!
530 \qmlproperty flags QtQuick::WheelHandler::acceptedDevices
531
532 The types of pointing devices that can activate this handler.
533
534 By default, this property is set to
535 \l{QInputDevice::DeviceType}{PointerDevice.Mouse}, so as to react only to
536 events from an actual mouse wheel.
537
538 WheelHandler can be made to respond to both mouse wheel and touchpad
539 scrolling by setting acceptedDevices to
540 \c{PointerDevice.Mouse | PointerDevice.TouchPad}.
541
542 \note Some non-mouse hardware (such as a touch-sensitive Wacom tablet, or a
543 Linux laptop touchpad) generates real wheel events from gestures.
544 WheelHandler will respond to those events as wheel events even if
545 \c acceptedDevices remains set to its default value.
546*/
547
548/*!
549 \qmlproperty flags QtQuick::WheelHandler::acceptedModifiers
550
551 If this property is set, it will require the given keyboard modifiers to
552 be pressed in order to react to wheel events, and otherwise ignore them.
553
554 If this property is set to \c Qt.KeyboardModifierMask (the default value),
555 the WheelHandler ignores the modifier keys.
556
557 For example, an \l [QML] Item could have two handlers, one of which is
558 enabled only if the required keyboard modifier is pressed, while the other
559 ignores events if any modifier is pressed:
560
561 \snippet pointerHandlers/wheelHandlerAcceptedModifiers.qml entire
562
563 The available modifiers are as follows:
564
565 \value NoModifier No modifier key is allowed.
566 \value ShiftModifier A Shift key on the keyboard must be pressed.
567 \value ControlModifier A Ctrl key on the keyboard must be pressed.
568 \value AltModifier An Alt key on the keyboard must be pressed.
569 \value MetaModifier A Meta key on the keyboard must be pressed.
570 \value KeypadModifier A keypad button must be pressed.
571 \value GroupSwitchModifier X11 only (unless activated on Windows by a command line argument).
572 A Mode_switch key on the keyboard must be pressed.
573 \value KeyboardModifierMask The handler does not care which modifiers are pressed.
574
575 \sa Qt::KeyboardModifier
576*/
577
578/*! \internal
579 \qmlproperty flags QtQuick::WheelHandler::acceptedPointerTypes
580
581 This overrides QtQuick::PointerDeviceHandler::acceptedPointerTypes
582 and hides it from the documentation as the property is not relevant for
583 WheelHandler.
584*/
585
586/*!
587 \readonly
588 \qmlproperty bool QtQuick::WheelHandler::active
589
590 This holds \c true whenever the WheelHandler has recently seen a
591 QWheelEvent, is keeping its properties up-to-date, and actively manipulating
592 its \l target (if any).
593
594 \sa activeTimeout
595*/
596
597/*! \internal
598 \qmlproperty flags QtQuick::WheelHandler::cursorShape
599
600 This overrides QtQuick::PointerHandler::cursorShape
601 and hides it from the documentation as the property is not relevant for
602 WheelHandler.
603*/
604
605/*! \internal
606 \qmlproperty flags QtQuick::WheelHandler::dragThreshold
607
608 This overrides QtQuick::PointerHandler::dragThreshold
609 and hides it from the documentation as the property is not relevant for
610 WheelHandler.
611*/
612
613/*! \internal
614 \qmlproperty flags QtQuick::WheelHandler::grabPermissions
615
616 This overrides QtQuick::PointerHandler::grabPermissions
617 and hides it from the documentation as the property is not relevant for
618 WheelHandler.
619*/
620
621/*!
622 \qmlproperty real QtQuick::WheelHandler::margin
623
624 The margin beyond the bounds of the \l {PointerHandler::parent}{parent}
625 item within which the WheelHandler can react. For example if \c margin
626 is set to \c 10, you could place the cursor up to 10 pixels outside the
627 visible edge of the item, and it will still react to the wheel:
628
629 \snippet pointerHandlers/wheelHandlerMargin.qml entire
630
631 The default value is \c 0.
632*/
633
634/*! \internal
635 \qmlsignal QtQuick::WheelHandler::grabChanged(PointerDevice::GrabTransition transition, eventPoint point)
636
637 This overrides QtQuick::PointerHandler::grabChanged
638 and hides it from the documentation as the signal is not relevant for
639 WheelHandler.
640*/
641
642/*! \internal
643 \qmlsignal QtQuick::WheelHandler::canceled(eventPoint point)
644
645 This overrides QtQuick::PointerHandler::canceled
646 and hides it from the documentation as the signal is not relevant for
647 WheelHandler.
648*/
649
650QT_END_NAMESPACE
651
652#include "moc_qquickwheelhandler_p.cpp"