8#include <QtQml/qqmlinfo.h>
9#include <QtQuick/private/qquickflickable_p.h>
10#if QT_CONFIG(accessibility)
11#include <QtQuick/private/qquickaccessibleattached_p.h>
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
131 qreal visualPos = position;
133 if (minimumSize > size && size != 1.0)
134 visualPos = position / (1.0 - size) * (1.0 - minimumSize);
136 qreal maximumSize = qMax<qreal>(0.0, 1.0 - visualPos);
137 qreal visualSize = qMax<qreal>(minimumSize,
138 qMin<qreal>(qMax(size, minimumSize) + qMin<qreal>(0, visualPos),
141 visualPos = qMax<qreal>(0,qMin<qreal>(visualPos,qMax<qreal>(0, 1.0 - visualSize)));
143 return VisualArea(visualPos, visualSize);
148 if (minimumSize > size && minimumSize != 1.0)
149 return position * (1.0 - size) / (1.0 - minimumSize);
155 const qreal effectiveStep = stepSize * (1.0 - size);
156 if (qFuzzyIsNull(effectiveStep))
159 return qRound(position / effectiveStep) * effectiveStep;
164 Q_Q(
const QQuickScrollBar);
165 if (orientation == Qt::Horizontal)
166 return logicalPosition(point.x() - q->leftPadding()) / q->availableWidth();
168 return logicalPosition(point.y() - q->topPadding()) / q->availableHeight();
173 Q_Q(QQuickScrollBar);
179 q->setAcceptedMouseButtons(Qt::LeftButton);
180#if QT_CONFIG(quicktemplates2_multitouch)
181 q->setAcceptTouchEvents(
true);
184 q->setCursor(Qt::ArrowCursor);
187 q->setAcceptedMouseButtons(Qt::NoButton);
188#if QT_CONFIG(quicktemplates2_multitouch)
189 q->setAcceptTouchEvents(
false);
196 emit q->interactiveChanged();
201 Q_Q(QQuickScrollBar);
202#if QT_CONFIG(quicktemplates2_hover)
203 bool hover = hovered;
207 q->setActive(moving || (interactive && (pressed || hover)));
212 Q_Q(QQuickScrollBar);
218 const VisualArea visual = visualArea();
220 if (orientation == Qt::Horizontal) {
221 contentItem->setPosition(QPointF(q->leftPadding() + visual.position * q->availableWidth(), q->topPadding()));
222 contentItem->setSize(QSizeF(q->availableWidth() * visual.size, q->availableHeight()));
224 contentItem->setPosition(QPointF(q->leftPadding(), q->topPadding() + visual.position * q->availableHeight()));
225 contentItem->setSize(QSizeF(q->availableWidth(), q->availableHeight() * visual.size));
231 Q_Q(QQuickScrollBar);
232 QQuickControlPrivate::itemImplicitWidthChanged(item);
233 QQuickIndicatorButton *indicatorButton = q->decreaseVisual();
234 if (!indicatorButton || item != indicatorButton->indicator()) {
235 indicatorButton = q->increaseVisual();
236 if (!indicatorButton || item != indicatorButton->indicator())
240 emit indicatorButton->implicitIndicatorWidthChanged();
245 Q_Q(QQuickScrollBar);
246 QQuickControlPrivate::itemImplicitHeightChanged(item);
247 QQuickIndicatorButton *indicatorButton = q->decreaseVisual();
248 if (!indicatorButton || item != indicatorButton->indicator()) {
249 indicatorButton = q->increaseVisual();
250 if (!indicatorButton || item != indicatorButton->indicator())
254 emit indicatorButton->implicitIndicatorHeightChanged();
259 Q_Q(QQuickScrollBar);
260 QQuickControlPrivate::handlePress(point, timestamp);
261 if (QQuickIndicatorButton *indicatorButton = q->decreaseVisual()) {
262 QQuickItem *decreaseArrow = indicatorButton->indicator();
263 if (decreaseArrow && decreaseArrow->contains(q->mapToItem(decreaseArrow, point + QPointF(0.5, 0.5)))) {
264 indicatorButton->setPressed(
true);
270 if (QQuickIndicatorButton *increaseObject = q->increaseVisual()) {
271 QQuickItem *increaseArrow = increaseObject->indicator();
272 if (increaseArrow && increaseArrow->contains(q->mapToItem(increaseArrow, point + QPointF(0.5, 0.5)))) {
273 increaseObject->setPressed(
true);
279 offset = positionAt(point) - position;
280 qreal sz = qMax(size, logicalPosition(minimumSize));
281 if (offset < 0 || offset > sz)
289 Q_Q(QQuickScrollBar);
290 QQuickControlPrivate::handleMove(point, timestamp);
293
294
295
296
297
298
302 qreal pos = qMax<qreal>(0.0, qMin<qreal>(positionAt(point) - offset, 1.0 - size));
303 if (snapMode == QQuickScrollBar::SnapAlways)
304 pos = snapPosition(pos);
311 Q_Q(QQuickScrollBar);
312 QQuickControlPrivate::handleRelease(point, timestamp);
314 if (orientation == Qt::Vertical) {
315 if (point.y() < q->topPadding() || point.y() >= (q->height() - q->bottomPadding()))
318 if (point.x() < q->leftPadding() || point.x() >= (q->width() - q->rightPadding()))
322 qreal pos = qMax<qreal>(0.0, qMin<qreal>(positionAt(point) - offset, 1.0 - size));
323 if (snapMode != QQuickScrollBar::NoSnap)
324 pos = snapPosition(pos);
327 q->setPressed(
false);
333 Q_Q(QQuickScrollBar);
334 QQuickControlPrivate::handleUngrab();
336 q->setPressed(
false);
341 Q_Q(QQuickScrollBar);
342 if (!qFuzzyCompare(newVisualArea.size, oldVisualArea.size))
343 emit q->visualSizeChanged();
344 if (!qFuzzyCompare(newVisualArea.position, oldVisualArea.position))
345 emit q->visualPositionChanged();
350 Q_Q(QQuickScrollBar);
351 auto updateHoverOnButton = [&](QQuickIndicatorButton *sbButton) {
353 bool hovered = newHoverState.value_or(
false);
354 if (!newHoverState.has_value()) {
355 if (QQuickItem *indicator = sbButton->indicator())
356 hovered = indicator->contains(q->mapToItem(indicator, pos));
358 sbButton->setHovered(hovered);
361 updateHoverOnButton(q->decreaseVisual());
362 updateHoverOnButton(q->increaseVisual());
365QQuickScrollBar::QQuickScrollBar(QQuickItem *parent)
366 : QQuickControl(*(
new QQuickScrollBarPrivate), parent)
368 Q_D(QQuickScrollBar);
369 d->decreaseVisual =
new QQuickIndicatorButton(
this);
370 d->increaseVisual =
new QQuickIndicatorButton(
this);
371 d->setSizePolicy(QLayoutPolicy::Preferred, QLayoutPolicy::Fixed);
372 setKeepMouseGrab(
true);
373 setAcceptedMouseButtons(Qt::LeftButton);
374#if QT_CONFIG(quicktemplates2_multitouch)
375 setAcceptTouchEvents(
true);
378 setCursor(Qt::ArrowCursor);
382QQuickScrollBarAttached *QQuickScrollBar::qmlAttachedProperties(QObject *object)
384 return new QQuickScrollBarAttached(object);
388
389
390
391
392
393
394
395
396
397
398
399qreal QQuickScrollBar::size()
const
401 Q_D(
const QQuickScrollBar);
405void QQuickScrollBar::setSize(qreal size)
407 Q_D(QQuickScrollBar);
408 if (!qt_is_finite(size))
410 size = qBound(0.0, size, 1.0);
411 if (qFuzzyCompare(d->size, size))
414 const auto oldVisualArea = d->visualArea();
416 if (d->size + d->position > 1.0) {
417 d->setPosition(1.0 - d->size,
false);
420 if (isComponentComplete())
423 d->visualAreaChange(d->visualArea(), oldVisualArea);
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443qreal QQuickScrollBar::position()
const
445 Q_D(
const QQuickScrollBar);
449void QQuickScrollBar::setPosition(qreal position)
451 Q_D(QQuickScrollBar);
452 d->setPosition(position);
457 Q_Q(QQuickScrollBar);
458 if (!qt_is_finite(newPosition) || qFuzzyCompare(position, newPosition))
461 auto oldVisualArea = visualArea();
462 position = newPosition;
463 if (q->isComponentComplete())
465 emit q->positionChanged();
466 if (notifyVisualChange)
467 visualAreaChange(visualArea(), oldVisualArea);
471
472
473
474
475
476
477qreal QQuickScrollBar::stepSize()
const
479 Q_D(
const QQuickScrollBar);
483void QQuickScrollBar::setStepSize(qreal step)
485 Q_D(QQuickScrollBar);
486 if (!qt_is_finite(step) || qFuzzyCompare(d->stepSize, step))
490 emit stepSizeChanged();
494
495
496
497
498
499
500
501
502
503
504
505bool QQuickScrollBar::isActive()
const
507 Q_D(
const QQuickScrollBar);
511void QQuickScrollBar::setActive(
bool active)
513 Q_D(QQuickScrollBar);
514 if (d->active == active)
518 emit activeChanged();
522
523
524
525
526bool QQuickScrollBar::isPressed()
const
528 Q_D(
const QQuickScrollBar);
532void QQuickScrollBar::setPressed(
bool pressed)
534 Q_D(QQuickScrollBar);
536 if (QQuickIndicatorButton *button = decreaseVisual())
537 button->setPressed(
false);
538 if (QQuickIndicatorButton *button = increaseVisual())
539 button->setPressed(
false);
541 if (d->pressed == pressed)
544 d->pressed = pressed;
545 setAccessibleProperty(
"pressed", pressed);
547 emit pressedChanged();
551
552
553
554
555
556
557
558
559
560
561
562
563
564Qt::Orientation QQuickScrollBar::orientation()
const
566 Q_D(
const QQuickScrollBar);
567 return d->orientation;
570void QQuickScrollBar::setOrientation(Qt::Orientation orientation)
572 Q_D(QQuickScrollBar);
573 if (d->orientation == orientation)
576 if (orientation == Qt::Horizontal)
577 d->setSizePolicy(QLayoutPolicy::Preferred, QLayoutPolicy::Fixed);
579 d->setSizePolicy(QLayoutPolicy::Fixed, QLayoutPolicy::Preferred);
581 d->orientation = orientation;
582 if (isComponentComplete())
584 emit orientationChanged();
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611QQuickScrollBar::SnapMode QQuickScrollBar::snapMode()
const
613 Q_D(
const QQuickScrollBar);
617void QQuickScrollBar::setSnapMode(SnapMode mode)
619 Q_D(QQuickScrollBar);
620 if (d->snapMode == mode)
624 emit snapModeChanged();
628
629
630
631
632
633
634
635
636
637bool QQuickScrollBar::isInteractive()
const
639 Q_D(
const QQuickScrollBar);
640 return d->interactive;
643void QQuickScrollBar::setInteractive(
bool interactive)
645 Q_D(QQuickScrollBar);
646 d->explicitInteractive =
true;
647 d->setInteractive(interactive);
650void QQuickScrollBar::resetInteractive()
652 Q_D(QQuickScrollBar);
653 d->explicitInteractive =
false;
654 d->setInteractive(
true);
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682QQuickScrollBar::Policy QQuickScrollBar::policy()
const
684 Q_D(
const QQuickScrollBar);
688void QQuickScrollBar::setPolicy(Policy policy)
690 Q_D(QQuickScrollBar);
691 if (d->policy == policy)
695 emit policyChanged();
699
700
701
702
703
704
705
706
707bool QQuickScrollBar::isHorizontal()
const
709 Q_D(
const QQuickScrollBar);
710 return d->orientation == Qt::Horizontal;
714
715
716
717
718
719
720
721
722bool QQuickScrollBar::isVertical()
const
724 Q_D(
const QQuickScrollBar);
725 return d->orientation == Qt::Vertical;
729
730
731
732
733
734
735
736qreal QQuickScrollBar::minimumSize()
const
738 Q_D(
const QQuickScrollBar);
739 return d->minimumSize;
742void QQuickScrollBar::setMinimumSize(qreal minimumSize)
744 Q_D(QQuickScrollBar);
745 if (!qt_is_finite(minimumSize) || qFuzzyCompare(d->minimumSize, minimumSize))
748 auto oldVisualArea = d->visualArea();
749 d->minimumSize = qBound(0.0, minimumSize, 1.0);
750 if (isComponentComplete())
752 emit minimumSizeChanged();
753 d->visualAreaChange(d->visualArea(), oldVisualArea);
757
758
759
760
761
762
763
764
765
766qreal QQuickScrollBar::visualSize()
const
768 Q_D(
const QQuickScrollBar);
769 return d->visualArea().size;
773
774
775
776
777
778
779
780
781
782qreal QQuickScrollBar::visualPosition()
const
784 Q_D(
const QQuickScrollBar);
785 return d->visualArea().position;
788QQuickIndicatorButton *QQuickScrollBar::decreaseVisual()
790 Q_D(QQuickScrollBar);
791 return d->decreaseVisual;
794QQuickIndicatorButton *QQuickScrollBar::increaseVisual()
796 Q_D(QQuickScrollBar);
797 return d->increaseVisual;
801
802
803
804
805
806
807void QQuickScrollBar::increase()
809 Q_D(QQuickScrollBar);
810 qreal step = qFuzzyIsNull(d->stepSize) ? 0.1 : d->stepSize;
811 bool wasActive = d->active;
813 setPosition(qMin<qreal>(1.0 - d->size, d->position + step));
814 setActive(wasActive);
818
819
820
821
822
823
824void QQuickScrollBar::decrease()
826 Q_D(QQuickScrollBar);
827 qreal step = qFuzzyIsNull(d->stepSize) ? 0.1 : d->stepSize;
828 bool wasActive = d->active;
830 setPosition(qMax<qreal>(0.0, d->position - step));
831 setActive(wasActive);
834void QQuickScrollBar::mousePressEvent(QMouseEvent *event)
836 Q_D(QQuickScrollBar);
837 QQuickControl::mousePressEvent(event);
838 d->handleMove(event->position(), event->timestamp());
841#if QT_CONFIG(quicktemplates2_hover)
842void QQuickScrollBar::hoverChange()
844 Q_D(QQuickScrollBar);
848void QQuickScrollBar::hoverEnterEvent(QHoverEvent *event)
850 Q_D(QQuickScrollBar);
851 QQuickControl::hoverEnterEvent(event);
852 d->updateHover(event->position());
856void QQuickScrollBar::hoverMoveEvent(QHoverEvent *event)
858 Q_D(QQuickScrollBar);
859 QQuickControl::hoverMoveEvent(event);
860 d->updateHover(event->position());
864void QQuickScrollBar::hoverLeaveEvent(QHoverEvent *event)
866 Q_D(QQuickScrollBar);
867 QQuickControl::hoverLeaveEvent(event);
869 d->updateHover(QPoint(),
false);
874void QQuickScrollBar::classBegin()
876 Q_D(QQuickScrollBar);
877 QQuickControl::classBegin();
879 QQmlContext *context = qmlContext(
this);
881 QQmlEngine::setContextForObject(d->decreaseVisual, context);
882 QQmlEngine::setContextForObject(d->increaseVisual, context);
886void QQuickScrollBar::componentComplete()
888 Q_D(QQuickScrollBar);
889 QQuickIndicatorButtonPrivate::get(d->decreaseVisual)->executeIndicator(
true);
890 QQuickIndicatorButtonPrivate::get(d->increaseVisual)->executeIndicator(
true);
892 QQuickControl::componentComplete();
895#if QT_CONFIG(accessibility)
896void QQuickScrollBar::accessibilityActiveChanged(
bool active)
898 QQuickControl::accessibilityActiveChanged(active);
900 Q_D(QQuickScrollBar);
902 setAccessibleProperty(
"pressed", d->pressed);
904 if (QQuickAccessibleAttached *accessibleAttached = QQuickControlPrivate::accessibleAttached(
this)) {
905 connect(accessibleAttached, &QQuickAccessibleAttached::increaseAction,
this, &QQuickScrollBar::increase);
906 connect(accessibleAttached, &QQuickAccessibleAttached::decreaseAction,
this, &QQuickScrollBar::decrease);
909 if (QQuickAccessibleAttached *accessibleAttached = QQuickControlPrivate::accessibleAttached(
this)) {
910 disconnect(accessibleAttached, &QQuickAccessibleAttached::increaseAction,
this, &QQuickScrollBar::increase);
911 disconnect(accessibleAttached, &QQuickAccessibleAttached::decreaseAction,
this, &QQuickScrollBar::decrease);
916QAccessible::Role QQuickScrollBar::accessibleRole()
const
918 return QAccessible::ScrollBar;
928 QQuickItemPrivate::get(flickable)->removeItemChangeListener(
this, QQuickItemPrivate::Geometry);
929 QQuickItemPrivate::get(flickable)->removeItemChangeListener(
this, QQuickItemPrivate::Destroyed);
941 QQuickItemPrivate::get(item)->updateOrAddGeometryChangeListener(
this, QQuickGeometryChange::Size);
942 QQuickItemPrivate::get(item)->updateOrAddItemChangeListener(
this, QQuickItemPrivate::Destroyed);
952 Q_ASSERT(flickable && horizontal);
954 connect(flickable, &QQuickFlickable::movingHorizontallyChanged,
this, &QQuickScrollBarAttachedPrivate::activateHorizontal);
957 QObject *area = flickable->property(
"visibleArea").value<QObject *>();
958 QObject::connect(area, SIGNAL(widthRatioChanged(qreal)), horizontal, SLOT(setSize(qreal)));
959 QObject::connect(area, SIGNAL(xPositionChanged(qreal)), horizontal, SLOT(setPosition(qreal)));
962 QQuickItem *parent = horizontal->parentItem();
963 if (parent && parent == flickable->parentItem())
964 horizontal->stackAfter(flickable);
968 if (
auto control = qobject_cast<QQuickControl*>(q_func()->parent())) {
969 const auto visibility = horizontal->policy() != QQuickScrollBar::AlwaysOff
970 ? QQuickControlPrivate::UnhideVisibility::Show : QQuickControlPrivate::UnhideVisibility::Hide;
971 QQuickControlPrivate::unhideOldItem(control, horizontal, visibility);
975 horizontal->setSize(area->property(
"widthRatio").toReal());
976 horizontal->setPosition(area->property(
"xPosition").toReal());
981 Q_ASSERT(flickable && vertical);
983 connect(flickable, &QQuickFlickable::movingVerticallyChanged,
this, &QQuickScrollBarAttachedPrivate::activateVertical);
986 QObject *area = flickable->property(
"visibleArea").value<QObject *>();
987 QObject::connect(area, SIGNAL(heightRatioChanged(qreal)), vertical, SLOT(setSize(qreal)));
988 QObject::connect(area, SIGNAL(yPositionChanged(qreal)), vertical, SLOT(setPosition(qreal)));
991 QQuickItem *parent = vertical->parentItem();
992 if (parent && parent == flickable->parentItem())
993 vertical->stackAfter(flickable);
995 if (
auto control = qobject_cast<QQuickControl*>(q_func()->parent())) {
996 const auto visibility = vertical->policy() != QQuickScrollBar::AlwaysOff
997 ? QQuickControlPrivate::UnhideVisibility::Show : QQuickControlPrivate::UnhideVisibility::Hide;
998 QQuickControlPrivate::unhideOldItem(control, vertical, visibility);
1002 vertical->setSize(area->property(
"heightRatio").toReal());
1003 vertical->setPosition(area->property(
"yPosition").toReal());
1008 Q_ASSERT(flickable && horizontal);
1010 QQuickControlPrivate::hideOldItem(horizontal);
1015 const QQmlProperty visibleProperty(horizontal, QStringLiteral(
"visible"));
1016 const QQmlProperty parentProperty(horizontal, QStringLiteral(
"parent"));
1017 QQmlPropertyPrivate::removeBinding(visibleProperty);
1018 QQmlPropertyPrivate::removeBinding(parentProperty);
1020 disconnect(flickable, &QQuickFlickable::movingHorizontallyChanged,
this, &QQuickScrollBarAttachedPrivate::activateHorizontal);
1023 QObject *area = flickable->property(
"visibleArea").value<QObject *>();
1024 QObject::disconnect(area, SIGNAL(widthRatioChanged(qreal)), horizontal, SLOT(setSize(qreal)));
1025 QObject::disconnect(area, SIGNAL(xPositionChanged(qreal)), horizontal, SLOT(setPosition(qreal)));
1030 Q_ASSERT(flickable && vertical);
1032 QQuickControlPrivate::hideOldItem(vertical);
1033 const QQmlProperty visibleProperty(vertical, QStringLiteral(
"visible"));
1034 const QQmlProperty parentProperty(vertical, QStringLiteral(
"parent"));
1035 QQmlPropertyPrivate::removeBinding(visibleProperty);
1036 QQmlPropertyPrivate::removeBinding(parentProperty);
1038 disconnect(flickable, &QQuickFlickable::movingVerticallyChanged,
this, &QQuickScrollBarAttachedPrivate::activateVertical);
1041 QObject *area = flickable->property(
"visibleArea").value<QObject *>();
1042 QObject::disconnect(area, SIGNAL(heightRatioChanged(qreal)), vertical, SLOT(setSize(qreal)));
1043 QObject::disconnect(area, SIGNAL(yPositionChanged(qreal)), vertical, SLOT(setPosition(qreal)));
1073 const qreal viewwidth = f->width();
1074 const qreal maxxextent = -f->maxXExtent() + f->minXExtent();
1075 const qreal cx = horizontal->position() * (maxxextent + viewwidth) - f->minXExtent();
1077 if (!qIsNaN(cx) && !qFuzzyCompare(cx,
flickable->contentX()))
1088 const qreal viewheight = f->height();
1089 const qreal maxyextent = -f->maxYExtent() + f->minYExtent();
1090 const qreal cy = vertical->position() * (maxyextent + viewheight) - f->minYExtent();
1092 if (!qIsNaN(cy) && !qFuzzyCompare(cy,
flickable->contentY()))
1103 Q_ASSERT(horizontal && flickable);
1104 if (horizontal->parentItem() != flickable)
1106 horizontal->setWidth(flickable->width());
1108 horizontal->setY(flickable->height() - horizontal->height());
1113 Q_ASSERT(vertical && flickable);
1114 if (vertical->parentItem() != flickable)
1116 vertical->setHeight(flickable->height());
1118 vertical->setX(vertical->isMirrored() ? 0 : flickable->width() - vertical->width());
1125 if (horizontal && horizontal->height() > 0) {
1126#ifdef QT_QUICK_NEW_GEOMETRY_CHANGED_HANDLING
1127 bool move = qFuzzyIsNull(horizontal->y()) || qFuzzyCompare(horizontal->y(), diff.height() - horizontal->height());
1129 bool move = qFuzzyIsNull(horizontal->y()) || qFuzzyCompare(horizontal->y(), item->height() - diff.height() - horizontal->height());
1134 if (vertical && vertical->width() > 0) {
1135#ifdef QT_QUICK_NEW_GEOMETRY_CHANGED_HANDLING
1136 bool move = qFuzzyIsNull(vertical->x()) || qFuzzyCompare(vertical->x(), diff.width() - vertical->width());
1138 bool move = qFuzzyIsNull(vertical->x()) || qFuzzyCompare(vertical->x(), item->width() - diff.width() - vertical->width());
1147 if (item == vertical && flickable)
1153 if (item == horizontal && flickable)
1161 if (item == horizontal)
1162 horizontal =
nullptr;
1163 if (item == vertical)
1167QQuickScrollBarAttached::QQuickScrollBarAttached(QObject *parent)
1168 : QObject(*(
new QQuickScrollBarAttachedPrivate), parent)
1170 Q_D(QQuickScrollBarAttached);
1171 d->setFlickable(qobject_cast<QQuickFlickable *>(parent));
1173 if (parent && !d->flickable && !qobject_cast<QQuickScrollView *>(parent))
1174 qmlWarning(parent) <<
"ScrollBar attached property must be attached to an object deriving from Flickable or ScrollView";
1177QQuickScrollBarAttached::~QQuickScrollBarAttached()
1179 Q_D(QQuickScrollBarAttached);
1180 if (d->horizontal) {
1181 QQuickItemPrivate::get(d->horizontal)->removeItemChangeListener(d, QsbHorizontalChangeTypes);
1182 d->horizontal =
nullptr;
1185 QQuickItemPrivate::get(d->vertical)->removeItemChangeListener(d, QsbVerticalChangeTypes);
1186 d->vertical =
nullptr;
1188 d->setFlickable(
nullptr);
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205QQuickScrollBar *QQuickScrollBarAttached::horizontal()
const
1207 Q_D(
const QQuickScrollBarAttached);
1208 return d->horizontal;
1211void QQuickScrollBarAttached::setHorizontal(QQuickScrollBar *horizontal)
1213 Q_D(QQuickScrollBarAttached);
1214 if (d->horizontal == horizontal)
1217 if (d->horizontal) {
1218 QQuickItemPrivate::get(d->horizontal)->removeItemChangeListener(d, QsbHorizontalChangeTypes);
1219 QObjectPrivate::disconnect(d->horizontal, &QQuickScrollBar::positionChanged, d, &QQuickScrollBarAttachedPrivate::scrollHorizontal);
1222 d->cleanupHorizontal();
1225 d->horizontal = horizontal;
1228 if (!horizontal->parentItem())
1229 horizontal->setParentItem(qobject_cast<QQuickItem *>(parent()));
1230 horizontal->setOrientation(Qt::Horizontal);
1232 QQuickItemPrivate::get(horizontal)->addItemChangeListener(d, QsbHorizontalChangeTypes);
1233 QObjectPrivate::connect(horizontal, &QQuickScrollBar::positionChanged, d, &QQuickScrollBarAttachedPrivate::scrollHorizontal);
1236 d->initHorizontal();
1238 emit horizontalChanged();
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255QQuickScrollBar *QQuickScrollBarAttached::vertical()
const
1257 Q_D(
const QQuickScrollBarAttached);
1261void QQuickScrollBarAttached::setVertical(QQuickScrollBar *vertical)
1263 Q_D(QQuickScrollBarAttached);
1264 if (d->vertical == vertical)
1268 QQuickItemPrivate::get(d->vertical)->removeItemChangeListener(d, QsbVerticalChangeTypes);
1269 QObjectPrivate::disconnect(d->vertical, &QQuickScrollBar::mirroredChanged, d, &QQuickScrollBarAttachedPrivate::mirrorVertical);
1270 QObjectPrivate::disconnect(d->vertical, &QQuickScrollBar::positionChanged, d, &QQuickScrollBarAttachedPrivate::scrollVertical);
1273 d->cleanupVertical();
1276 d->vertical = vertical;
1279 if (!vertical->parentItem())
1280 vertical->setParentItem(qobject_cast<QQuickItem *>(parent()));
1281 vertical->setOrientation(Qt::Vertical);
1283 QQuickItemPrivate::get(vertical)->addItemChangeListener(d, QsbVerticalChangeTypes);
1284 QObjectPrivate::connect(vertical, &QQuickScrollBar::mirroredChanged, d, &QQuickScrollBarAttachedPrivate::mirrorVertical);
1285 QObjectPrivate::connect(vertical, &QQuickScrollBar::positionChanged, d, &QQuickScrollBarAttachedPrivate::scrollVertical);
1290 emit verticalChanged();
1295#include "moc_qquickscrollbar_p.cpp"
Combined button and popup list for selecting options.