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
qquickscrollindicator.cpp
Go to the documentation of this file.
1// Copyright (C) 2017 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
8#include <QtQml/qqmlinfo.h>
9#include <QtQuick/private/qquickflickable_p.h>
10#include <QtQuick/private/qquickitemchangelistener_p.h>
11
13
14/*!
15 \qmltype ScrollIndicator
16 \inherits Control
17//! \nativetype QQuickScrollIndicator
18 \inqmlmodule QtQuick.Controls
19 \since 5.7
20 \ingroup qtquickcontrols-indicators
21 \brief Vertical or horizontal non-interactive scroll indicator.
22
23 \image qtquickcontrols-scrollindicator.gif
24 {Scroll indicator showing scroll position}
25
26 ScrollIndicator is a non-interactive indicator that indicates the current scroll
27 position. A scroll indicator can be either \l vertical or \l horizontal, and can
28 be attached to any \l Flickable, such as \l ListView and \l GridView.
29
30 \code
31 Flickable {
32 // ...
33 ScrollIndicator.vertical: ScrollIndicator { }
34 }
35 \endcode
36
37 \section1 Attaching ScrollIndicator to a Flickable
38
39 \note When ScrollIndicator is attached \l {ScrollIndicator::vertical}{vertically}
40 or \l {ScrollIndicator::horizontal}{horizontally} to a Flickable, its geometry and
41 the following properties are automatically set and updated as appropriate:
42
43 \list
44 \li \l orientation
45 \li \l position
46 \li \l size
47 \li \l active
48 \endlist
49
50 An attached ScrollIndicator re-parents itself to the target Flickable. A vertically
51 attached ScrollIndicator resizes itself to the height of the Flickable, and positions
52 itself to either side of it based on the \l {Control::mirrored}{layout direction}.
53 A horizontally attached ScrollIndicator resizes itself to the width of the Flickable,
54 and positions itself to the bottom. The automatic geometry management can be disabled
55 by specifying another parent for the attached ScrollIndicator. This can be useful, for
56 example, if the ScrollIndicator should be placed outside a clipping Flickable. This is
57 demonstrated by the following example:
58
59 \code
60 Flickable {
61 id: flickable
62 clip: true
63 // ...
64 ScrollIndicator.vertical: ScrollIndicator {
65 parent: flickable.parent
66 anchors.top: flickable.top
67 anchors.left: flickable.right
68 anchors.bottom: flickable.bottom
69 }
70 }
71 \endcode
72
73 \section1 Binding the Active State of Horizontal and Vertical Scroll Indicators
74
75 Horizontal and vertical scroll indicators do not share the \l active state with
76 each other by default. In order to keep both indicators visible whilst scrolling
77 to either direction, establish a two-way binding between the active states as
78 presented by the following example:
79
80 \snippet qtquickcontrols-scrollindicator-active.qml 1
81
82 \section1 Non-attached Scroll Indicators
83
84 It is possible to create an instance of ScrollIndicator without using the
85 attached property API. This is useful when the behavior of the attached
86 scoll indicator is not sufficient or a \l Flickable is not in use. In the
87 following example, horizontal and vertical scroll indicators are used to
88 indicate how far the user has scrolled over the text (using \l MouseArea
89 instead of \l Flickable):
90
91 \snippet qtquickcontrols-scrollindicator-non-attached.qml 1
92
93 \image qtquickcontrols-scrollindicator-non-attached.png
94 {Scroll indicator used standalone without attached property}
95
96 \include varying-delegate-heights-section.qdocinc {file} {1} {ScrollIndicator}
97
98 \sa ScrollBar, {Customizing ScrollIndicator}, {Indicator Controls}
99*/
100
101static const QQuickItemPrivate::ChangeTypes QsiChangeTypes = QQuickItemPrivate::Geometry | QQuickItemPrivate::Destroyed;
102static const QQuickItemPrivate::ChangeTypes QsiHorizontalChangeTypes = QsiChangeTypes | QQuickItemPrivate::ImplicitHeight;
103static const QQuickItemPrivate::ChangeTypes QsiVerticalChangeTypes = QsiChangeTypes | QQuickItemPrivate::ImplicitWidth;
104
106{
107 Q_DECLARE_PUBLIC(QQuickScrollIndicator)
108
109public:
111 {
116 };
118 void visualAreaChange(const VisualArea &newVisualArea, const VisualArea &oldVisualArea);
119
121
125 bool active = false;
127};
128
130{
131 qreal visualPos = position;
132 if (minimumSize > size)
133 visualPos = position / (1.0 - size) * (1.0 - minimumSize);
134
135 qreal maximumSize = qMax<qreal>(0.0, 1.0 - visualPos);
136 qreal visualSize = qMax<qreal>(minimumSize,
137 qMin<qreal>(qMax(size, minimumSize) + qMin<qreal>(0, visualPos),
138 maximumSize));
139
140 visualPos = qMax<qreal>(0,qMin<qreal>(visualPos,qMax<qreal>(0, 1.0 - visualSize)));
141
142 return VisualArea(visualPos, visualSize);
143}
144
145void QQuickScrollIndicatorPrivate::visualAreaChange(const VisualArea &newVisualArea, const VisualArea &oldVisualArea)
146{
147 Q_Q(QQuickScrollIndicator);
148 if (!qFuzzyCompare(newVisualArea.size, oldVisualArea.size))
149 emit q->visualSizeChanged();
150 if (!qFuzzyCompare(newVisualArea.position, oldVisualArea.position))
151 emit q->visualPositionChanged();
152}
153
155{
156 Q_Q(QQuickScrollIndicator);
157 if (!contentItem)
158 return;
159
160 // - negative overshoot (pos < 0): clamp the pos to 0, and deduct the overshoot from the size
161 // - positive overshoot (pos + size > 1): clamp the size to 1-pos
162 const VisualArea visual = visualArea();
163
164 if (orientation == Qt::Horizontal) {
165 contentItem->setPosition(QPointF(q->leftPadding() + visual.position * q->availableWidth(), q->topPadding()));
166 contentItem->setSize(QSizeF(q->availableWidth() * visual.size, q->availableHeight()));
167 } else {
168 contentItem->setPosition(QPointF(q->leftPadding(), q->topPadding() + visual.position * q->availableHeight()));
169 contentItem->setSize(QSizeF(q->availableWidth(), q->availableHeight() * visual.size));
170 }
171}
172
173QQuickScrollIndicator::QQuickScrollIndicator(QQuickItem *parent)
174 : QQuickControl(*(new QQuickScrollIndicatorPrivate), parent)
175{
176 Q_D(QQuickScrollIndicator);
177 d->setSizePolicy(QLayoutPolicy::Preferred, QLayoutPolicy::Fixed);
178}
179
180QQuickScrollIndicatorAttached *QQuickScrollIndicator::qmlAttachedProperties(QObject *object)
181{
182 return new QQuickScrollIndicatorAttached(object);
183}
184
185/*!
186 \qmlproperty real QtQuick.Controls::ScrollIndicator::size
187
188 This property holds the size of the indicator, scaled to \c {0.0 - 1.0}.
189
190 \sa {Flickable::visibleArea.heightRatio}{Flickable::visibleArea}
191
192 This property is automatically set when the scroll indicator is
193 \l {Attaching ScrollIndicator to a Flickable}{attached to a flickable}.
194
195 \sa minimumSize, visualSize
196*/
197qreal QQuickScrollIndicator::size() const
198{
199 Q_D(const QQuickScrollIndicator);
200 return d->size;
201}
202
203void QQuickScrollIndicator::setSize(qreal size)
204{
205 Q_D(QQuickScrollIndicator);
206 if (qFuzzyCompare(d->size, size))
207 return;
208
209 auto oldVisualArea = d->visualArea();
210 d->size = size;
211 if (d->size + d->position > 1.0) {
212 setPosition(1.0 - d->size);
213 oldVisualArea = d->visualArea();
214 }
215 if (isComponentComplete())
216 d->resizeContent();
217 emit sizeChanged();
218 d->visualAreaChange(d->visualArea(), oldVisualArea);
219}
220
221/*!
222 \qmlproperty real QtQuick.Controls::ScrollIndicator::position
223
224 This property holds the position of the indicator, scaled to \c {0.0 - 1.0}.
225
226 This property is automatically set when the scroll indicator is
227 \l {Attaching ScrollIndicator to a Flickable}{attached to a flickable}.
228
229 \sa {Flickable::visibleArea.yPosition}{Flickable::visibleArea}, visualPosition
230*/
231qreal QQuickScrollIndicator::position() const
232{
233 Q_D(const QQuickScrollIndicator);
234 return d->position;
235}
236
237void QQuickScrollIndicator::setPosition(qreal position)
238{
239 Q_D(QQuickScrollIndicator);
240 if (qFuzzyCompare(d->position, position))
241 return;
242
243 auto oldVisualArea = d->visualArea();
244 d->position = position;
245 if (isComponentComplete())
246 d->resizeContent();
247 emit positionChanged();
248 d->visualAreaChange(d->visualArea(), oldVisualArea);
249}
250
251/*!
252 \qmlproperty bool QtQuick.Controls::ScrollIndicator::active
253
254 This property holds whether the indicator is active, that is, when the
255 attached Flickable is \l {Flickable::moving}{moving}.
256
257 It is possible to keep \l {Binding the Active State of Horizontal and Vertical Scroll Indicators}
258 {both horizontal and vertical indicators visible} while scrolling in either direction.
259
260 This property is automatically set when the scroll indicator is
261 \l {Attaching ScrollIndicator to a Flickable}{attached to a flickable}.
262*/
263bool QQuickScrollIndicator::isActive() const
264{
265 Q_D(const QQuickScrollIndicator);
266 return d->active;
267}
268
269void QQuickScrollIndicator::setActive(bool active)
270{
271 Q_D(QQuickScrollIndicator);
272 if (d->active == active)
273 return;
274
275 d->active = active;
276 emit activeChanged();
277}
278
279/*!
280 \qmlproperty enumeration QtQuick.Controls::ScrollIndicator::orientation
281
282 This property holds the orientation of the indicator.
283
284 Possible values:
285 \value Qt.Horizontal Horizontal
286 \value Qt.Vertical Vertical (default)
287
288 This property is automatically set when the scroll indicator is
289 \l {Attaching ScrollIndicator to a Flickable}{attached to a flickable}.
290
291 \sa horizontal, vertical
292*/
293Qt::Orientation QQuickScrollIndicator::orientation() const
294{
295 Q_D(const QQuickScrollIndicator);
296 return d->orientation;
297}
298
299void QQuickScrollIndicator::setOrientation(Qt::Orientation orientation)
300{
301 Q_D(QQuickScrollIndicator);
302 if (d->orientation == orientation)
303 return;
304
305 if (orientation == Qt::Horizontal)
306 d->setSizePolicy(QLayoutPolicy::Preferred, QLayoutPolicy::Fixed);
307 else
308 d->setSizePolicy(QLayoutPolicy::Fixed, QLayoutPolicy::Preferred);
309
310 d->orientation = orientation;
311 if (isComponentComplete())
312 d->resizeContent();
313 emit orientationChanged();
314}
315
316/*!
317 \since QtQuick.Controls 2.3 (Qt 5.10)
318 \qmlproperty bool QtQuick.Controls::ScrollIndicator::horizontal
319 \readonly
320
321 This property holds whether the scroll indicator is horizontal.
322
323 \sa orientation
324*/
325bool QQuickScrollIndicator::isHorizontal() const
326{
327 Q_D(const QQuickScrollIndicator);
328 return d->orientation == Qt::Horizontal;
329}
330
331/*!
332 \since QtQuick.Controls 2.3 (Qt 5.10)
333 \qmlproperty bool QtQuick.Controls::ScrollIndicator::vertical
334 \readonly
335
336 This property holds whether the scroll indicator is vertical.
337
338 \sa orientation
339*/
340bool QQuickScrollIndicator::isVertical() const
341{
342 Q_D(const QQuickScrollIndicator);
343 return d->orientation == Qt::Vertical;
344}
345
346/*!
347 \since QtQuick.Controls 2.4 (Qt 5.11)
348 \qmlproperty real QtQuick.Controls::ScrollIndicator::minimumSize
349
350 This property holds the minimum size of the indicator, scaled to \c {0.0 - 1.0}.
351
352 \sa size, visualSize, visualPosition
353*/
354qreal QQuickScrollIndicator::minimumSize() const
355{
356 Q_D(const QQuickScrollIndicator);
357 return d->minimumSize;
358}
359
360void QQuickScrollIndicator::setMinimumSize(qreal minimumSize)
361{
362 Q_D(QQuickScrollIndicator);
363 if (qFuzzyCompare(d->minimumSize, minimumSize))
364 return;
365
366 auto oldVisualArea = d->visualArea();
367 d->minimumSize = minimumSize;
368 if (isComponentComplete())
369 d->resizeContent();
370 emit minimumSizeChanged();
371 d->visualAreaChange(d->visualArea(), oldVisualArea);
372}
373
374/*!
375 \since QtQuick.Controls 2.4 (Qt 5.11)
376 \qmlproperty real QtQuick.Controls::ScrollIndicator::visualSize
377
378 This property holds the effective visual size of the indicator,
379 which may be limited by the \l {minimumSize}{minimum size}.
380
381 \sa size, minimumSize
382*/
383qreal QQuickScrollIndicator::visualSize() const
384{
385 Q_D(const QQuickScrollIndicator);
386 return d->visualArea().size;
387}
388
389/*!
390 \since QtQuick.Controls 2.4 (Qt 5.11)
391 \qmlproperty real QtQuick.Controls::ScrollIndicator::visualPosition
392
393 This property holds the effective visual position of the indicator,
394 which may be limited by the \l {minimumSize}{minimum size}.
395
396 \sa position, minimumSize
397*/
398qreal QQuickScrollIndicator::visualPosition() const
399{
400 Q_D(const QQuickScrollIndicator);
401 return d->visualArea().position;
402}
403
406{
407public:
410
411 void layoutHorizontal(bool move = true);
412 void layoutVertical(bool move = true);
413
414 void itemGeometryChanged(QQuickItem *item, QQuickGeometryChange change, const QRectF &diff) override;
415 void itemImplicitWidthChanged(QQuickItem *item) override;
416 void itemImplicitHeightChanged(QQuickItem *item) override;
417 void itemDestroyed(QQuickItem *item) override;
418
419 QQuickFlickable *flickable = nullptr;
422};
423
425{
426 horizontal->setActive(flickable->isMovingHorizontally());
427}
428
430{
431 vertical->setActive(flickable->isMovingVertically());
432}
433
435{
436 Q_ASSERT(horizontal && flickable);
437 if (horizontal->parentItem() != flickable)
438 return;
439 horizontal->setWidth(flickable->width());
440 if (move)
441 horizontal->setY(flickable->height() - horizontal->height());
442}
443
445{
446 Q_ASSERT(vertical && flickable);
447 if (vertical->parentItem() != flickable)
448 return;
449 vertical->setHeight(flickable->height());
450 if (move && !QQuickItemPrivate::get(vertical)->isMirrored())
451 vertical->setX(flickable->width() - vertical->width());
452}
453
454void QQuickScrollIndicatorAttachedPrivate::itemGeometryChanged(QQuickItem *item, QQuickGeometryChange change, const QRectF &diff)
455{
456 Q_UNUSED(item);
457 Q_UNUSED(change);
458 if (horizontal && horizontal->height() > 0) {
459#ifdef QT_QUICK_NEW_GEOMETRY_CHANGED_HANDLING // TODO: correct/rename diff to oldGeometry
460 bool move = qFuzzyIsNull(horizontal->y()) || qFuzzyCompare(horizontal->y(), diff.height() - horizontal->height());
461#else
462 bool move = qFuzzyIsNull(horizontal->y()) || qFuzzyCompare(horizontal->y(), item->height() - diff.height() - horizontal->height());
463#endif
465 }
466 if (vertical && vertical->width() > 0) {
467#ifdef QT_QUICK_NEW_GEOMETRY_CHANGED_HANDLING // TODO: correct/rename diff to oldGeometry
468 bool move = qFuzzyIsNull(vertical->x()) || qFuzzyCompare(vertical->x(), diff.width() - vertical->width());
469#else
470 bool move = qFuzzyIsNull(vertical->x()) || qFuzzyCompare(vertical->x(), item->width() - diff.width() - vertical->width());
471#endif
473 }
474}
475
477{
478 if (item == vertical)
480}
481
483{
484 if (item == horizontal)
486}
487
489{
490 if (item == horizontal)
491 horizontal = nullptr;
492 if (item == vertical)
493 vertical = nullptr;
494}
495
496QQuickScrollIndicatorAttached::QQuickScrollIndicatorAttached(QObject *parent)
497 : QObject(*(new QQuickScrollIndicatorAttachedPrivate), parent)
498{
499 Q_D(QQuickScrollIndicatorAttached);
500 d->flickable = qobject_cast<QQuickFlickable *>(parent);
501 if (d->flickable)
502 QQuickItemPrivate::get(d->flickable)->updateOrAddGeometryChangeListener(d, QQuickGeometryChange::Size);
503 else if (parent)
504 qmlWarning(parent) << "ScrollIndicator attached property must be attached to an object deriving from Flickable";
505}
506
507QQuickScrollIndicatorAttached::~QQuickScrollIndicatorAttached()
508{
509 Q_D(QQuickScrollIndicatorAttached);
510 if (d->flickable) {
511 if (d->horizontal)
512 QQuickItemPrivate::get(d->horizontal)->removeItemChangeListener(d, QsiHorizontalChangeTypes);
513 if (d->vertical)
514 QQuickItemPrivate::get(d->vertical)->removeItemChangeListener(d, QsiVerticalChangeTypes);
515 // NOTE: Use removeItemChangeListener(Geometry) instead of updateOrRemoveGeometryChangeListener(Size).
516 // The latter doesn't remove the listener but only resets its types. Thus, it leaves behind a dangling
517 // pointer on destruction.
518 QQuickItemPrivate::get(d->flickable)->removeItemChangeListener(d, QQuickItemPrivate::Geometry);
519 }
520}
521
522/*!
523 \qmlattachedproperty ScrollIndicator QtQuick.Controls::ScrollIndicator::horizontal
524
525 This property attaches a horizontal scroll indicator to a \l Flickable.
526
527 \code
528 Flickable {
529 contentWidth: 2000
530 ScrollIndicator.horizontal: ScrollIndicator { }
531 }
532 \endcode
533
534 \sa {Attaching ScrollIndicator to a Flickable}
535*/
536QQuickScrollIndicator *QQuickScrollIndicatorAttached::horizontal() const
537{
538 Q_D(const QQuickScrollIndicatorAttached);
539 return d->horizontal;
540}
541
542void QQuickScrollIndicatorAttached::setHorizontal(QQuickScrollIndicator *horizontal)
543{
544 Q_D(QQuickScrollIndicatorAttached);
545 if (d->horizontal == horizontal)
546 return;
547
548 if (d->horizontal && d->flickable) {
549 QQuickItemPrivate::get(d->horizontal)->removeItemChangeListener(d, QsiHorizontalChangeTypes);
550 QObjectPrivate::disconnect(d->flickable, &QQuickFlickable::movingHorizontallyChanged, d, &QQuickScrollIndicatorAttachedPrivate::activateHorizontal);
551
552 // TODO: export QQuickFlickableVisibleArea
553 QObject *area = d->flickable->property("visibleArea").value<QObject *>();
554 disconnect(area, SIGNAL(widthRatioChanged(qreal)), d->horizontal, SLOT(setSize(qreal)));
555 disconnect(area, SIGNAL(xPositionChanged(qreal)), d->horizontal, SLOT(setPosition(qreal)));
556 }
557
558 d->horizontal = horizontal;
559
560 if (horizontal && d->flickable) {
561 if (!horizontal->parentItem())
562 horizontal->setParentItem(d->flickable);
563 horizontal->setOrientation(Qt::Horizontal);
564
565 QQuickItemPrivate::get(horizontal)->addItemChangeListener(d, QsiHorizontalChangeTypes);
566 QObjectPrivate::connect(d->flickable, &QQuickFlickable::movingHorizontallyChanged, d, &QQuickScrollIndicatorAttachedPrivate::activateHorizontal);
567
568 // TODO: export QQuickFlickableVisibleArea
569 QObject *area = d->flickable->property("visibleArea").value<QObject *>();
570 connect(area, SIGNAL(widthRatioChanged(qreal)), horizontal, SLOT(setSize(qreal)));
571 connect(area, SIGNAL(xPositionChanged(qreal)), horizontal, SLOT(setPosition(qreal)));
572
573 d->layoutHorizontal();
574 horizontal->setSize(area->property("widthRatio").toReal());
575 horizontal->setPosition(area->property("xPosition").toReal());
576 }
577 emit horizontalChanged();
578}
579
580/*!
581 \qmlattachedproperty ScrollIndicator QtQuick.Controls::ScrollIndicator::vertical
582
583 This property attaches a vertical scroll indicator to a \l Flickable.
584
585 \code
586 Flickable {
587 contentHeight: 2000
588 ScrollIndicator.vertical: ScrollIndicator { }
589 }
590 \endcode
591
592 \sa {Attaching ScrollIndicator to a Flickable}
593*/
594QQuickScrollIndicator *QQuickScrollIndicatorAttached::vertical() const
595{
596 Q_D(const QQuickScrollIndicatorAttached);
597 return d->vertical;
598}
599
600void QQuickScrollIndicatorAttached::setVertical(QQuickScrollIndicator *vertical)
601{
602 Q_D(QQuickScrollIndicatorAttached);
603 if (d->vertical == vertical)
604 return;
605
606 if (d->vertical && d->flickable) {
607 QQuickItemPrivate::get(d->vertical)->removeItemChangeListener(d, QsiVerticalChangeTypes);
608 QObjectPrivate::disconnect(d->flickable, &QQuickFlickable::movingVerticallyChanged, d, &QQuickScrollIndicatorAttachedPrivate::activateVertical);
609
610 // TODO: export QQuickFlickableVisibleArea
611 QObject *area = d->flickable->property("visibleArea").value<QObject *>();
612 disconnect(area, SIGNAL(heightRatioChanged(qreal)), d->vertical, SLOT(setSize(qreal)));
613 disconnect(area, SIGNAL(yPositionChanged(qreal)), d->vertical, SLOT(setPosition(qreal)));
614 }
615
616 d->vertical = vertical;
617
618 if (vertical && d->flickable) {
619 if (!vertical->parentItem())
620 vertical->setParentItem(d->flickable);
621 vertical->setOrientation(Qt::Vertical);
622
623 QQuickItemPrivate::get(vertical)->addItemChangeListener(d, QsiVerticalChangeTypes);
624 QObjectPrivate::connect(d->flickable, &QQuickFlickable::movingVerticallyChanged, d, &QQuickScrollIndicatorAttachedPrivate::activateVertical);
625
626 // TODO: export QQuickFlickableVisibleArea
627 QObject *area = d->flickable->property("visibleArea").value<QObject *>();
628 connect(area, SIGNAL(heightRatioChanged(qreal)), vertical, SLOT(setSize(qreal)));
629 connect(area, SIGNAL(yPositionChanged(qreal)), vertical, SLOT(setPosition(qreal)));
630
631 d->layoutVertical();
632 vertical->setSize(area->property("heightRatio").toReal());
633 vertical->setPosition(area->property("yPosition").toReal());
634 }
635 emit verticalChanged();
636}
637
638#if QT_CONFIG(quicktemplates2_multitouch)
639void QQuickScrollIndicator::touchEvent(QTouchEvent *event)
640{
641 event->ignore(); // QTBUG-61785
642}
643#endif
644
645#if QT_CONFIG(accessibility)
646QAccessible::Role QQuickScrollIndicator::accessibleRole() const
647{
648 return QAccessible::Indicator;
649}
650#endif
651
652QT_END_NAMESPACE
653
654#include "moc_qquickscrollindicator_p.cpp"
void itemGeometryChanged(QQuickItem *item, QQuickGeometryChange change, const QRectF &diff) override
void itemImplicitHeightChanged(QQuickItem *item) override
void itemImplicitWidthChanged(QQuickItem *item) override
void itemDestroyed(QQuickItem *item) override
void visualAreaChange(const VisualArea &newVisualArea, const VisualArea &oldVisualArea)
Combined button and popup list for selecting options.
static QT_BEGIN_NAMESPACE const QQuickItemPrivate::ChangeTypes QsiChangeTypes
Vertical or horizontal non-interactive scroll indicator.
static const QQuickItemPrivate::ChangeTypes QsiVerticalChangeTypes
static const QQuickItemPrivate::ChangeTypes QsiHorizontalChangeTypes