Qt 6.x
The Qt SDK
Loading...
Searching...
No Matches
qquickpopup.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
4#include "qquickpopup_p.h"
5#include "qquickpopup_p_p.h"
10#include "qquickoverlay_p_p.h"
11#include "qquickcontrol_p_p.h"
12#include "qquickdialog_p.h"
13
14#include <QtCore/qloggingcategory.h>
15#include <QtQml/qqmlinfo.h>
16#include <QtQuick/qquickitem.h>
17#include <QtQuick/private/qquickaccessibleattached_p.h>
18#include <QtQuick/private/qquicktransition_p.h>
19#include <QtQuick/private/qquickitem_p.h>
20
22
23Q_LOGGING_CATEGORY(lcDimmer, "qt.quick.controls.popup.dimmer")
24Q_LOGGING_CATEGORY(lcPopup, "qt.quick.controls.popup")
25
30
288const QQuickPopup::ClosePolicy QQuickPopupPrivate::DefaultClosePolicy = QQuickPopup::CloseOnEscape | QQuickPopup::CloseOnPressOutside;
289
291 : transitionManager(this)
292{
293}
294
296{
297 Q_Q(QQuickPopup);
299 popupItem->setVisible(false);
300 q->setParentItem(qobject_cast<QQuickItem *>(parent));
304 QObject::connect(popupItem, &QQuickControl::implicitContentWidthChanged, q, &QQuickPopup::implicitContentWidthChanged);
305 QObject::connect(popupItem, &QQuickControl::implicitContentHeightChanged, q, &QQuickPopup::implicitContentHeightChanged);
306 QObject::connect(popupItem, &QQuickControl::implicitBackgroundWidthChanged, q, &QQuickPopup::implicitBackgroundWidthChanged);
307 QObject::connect(popupItem, &QQuickControl::implicitBackgroundHeightChanged, q, &QQuickPopup::implicitBackgroundHeightChanged);
308}
309
311{
312 Q_Q(QQuickPopup);
313 if (QQuickDialog *dialog = qobject_cast<QQuickDialog*>(q))
314 dialog->reject();
315 else
316 q->close();
317 touchId = -1;
318}
319
320bool QQuickPopupPrivate::tryClose(const QPointF &pos, QQuickPopup::ClosePolicy flags)
321{
322 if (!interactive)
323 return false;
324
325 static const QQuickPopup::ClosePolicy outsideFlags = QQuickPopup::CloseOnPressOutside | QQuickPopup::CloseOnReleaseOutside;
326 static const QQuickPopup::ClosePolicy outsideParentFlags = QQuickPopup::CloseOnPressOutsideParent | QQuickPopup::CloseOnReleaseOutsideParent;
327
328 const bool onOutside = closePolicy & (flags & outsideFlags);
329 const bool onOutsideParent = closePolicy & (flags & outsideParentFlags);
330
331 if ((onOutside && outsidePressed) || (onOutsideParent && outsideParentPressed)) {
333 if (!onOutsideParent || !parentItem || !parentItem->contains(parentItem->mapFromScene(pos))) {
335 return true;
336 }
337 }
338 }
339 return false;
340}
341
342bool QQuickPopupPrivate::contains(const QPointF &scenePos) const
343{
344 return popupItem->contains(popupItem->mapFromScene(scenePos));
345}
346
347#if QT_CONFIG(quicktemplates2_multitouch)
348bool QQuickPopupPrivate::acceptTouch(const QTouchEvent::TouchPoint &point)
349{
350 if (point.id() == touchId)
351 return true;
352
353 if (touchId == -1 && point.state() != QEventPoint::Released) {
354 touchId = point.id();
355 return true;
356 }
357
358 return false;
359}
360#endif
361
363{
364 // don't propagate events within the popup beyond the overlay
367 return true;
368 }
369
370 // don't block presses and releases
371 // a) outside a non-modal popup,
372 // b) to popup children/content, or
373 // b) outside a modal popups's background dimming
374 return modal && ((popupItem != item) && !popupItem->isAncestorOf(item)) && (!dimmer || dimmer->contains(dimmer->mapFromScene(point)));
375}
376
378{
379 Q_UNUSED(timestamp);
380 pressPoint = point;
381 outsidePressed = !contains(point);
383 tryClose(point, QQuickPopup::CloseOnPressOutside | QQuickPopup::CloseOnPressOutsideParent);
384 return blockInput(item, point);
385}
386
388{
389 Q_UNUSED(timestamp);
390 return blockInput(item, point);
391}
392
394{
395 Q_UNUSED(timestamp);
396 if (item != popupItem && !contains(pressPoint))
397 tryClose(point, QQuickPopup::CloseOnReleaseOutside | QQuickPopup::CloseOnReleaseOutsideParent);
399 outsidePressed = false;
400 outsideParentPressed = false;
401 touchId = -1;
402 return blockInput(item, point);
403}
404
406{
407 Q_Q(QQuickPopup);
409 if (overlay) {
411 if (p->mouseGrabberPopup == q)
412 p->mouseGrabberPopup = nullptr;
413 }
415 touchId = -1;
416}
417
419{
420 switch (event->type()) {
422 return handlePress(item, event->scenePosition(), event->timestamp());
424 return handleMove(item, event->scenePosition(), event->timestamp());
426 return handleRelease(item, event->scenePosition(), event->timestamp());
427 default:
428 Q_UNREACHABLE_RETURN(false);
429 }
430}
431
433{
434 switch (event->type()) {
438 return blockInput(item, event->scenePosition());
439 default:
440 Q_UNREACHABLE_RETURN(false);
441 }
442}
443
444#if QT_CONFIG(quicktemplates2_multitouch)
445bool QQuickPopupPrivate::handleTouchEvent(QQuickItem *item, QTouchEvent *event)
446{
447 switch (event->type()) {
450 case QEvent::TouchEnd:
451 for (const QTouchEvent::TouchPoint &point : event->points()) {
452 if (event->type() != QEvent::TouchEnd && !acceptTouch(point))
453 return blockInput(item, point.position());
454
455 switch (point.state()) {
457 return handlePress(item, item->mapToScene(point.position()), event->timestamp());
459 return handleMove(item, item->mapToScene(point.position()), event->timestamp());
461 return handleRelease(item, item->mapToScene(point.position()), event->timestamp());
462 default:
463 break;
464 }
465 }
466 break;
467
469 handleUngrab();
470 break;
471
472 default:
473 break;
474 }
475
476 return false;
477}
478#endif
479
481{
482 Q_Q(QQuickPopup);
483 if (!window) {
484 qmlWarning(q) << "cannot find any window to open popup in.";
485 return false;
486 }
487
489 return false;
490
493 const auto popupStack = QQuickOverlayPrivate::get(overlay)->stackingOrderPopups();
494 popupItem->setParentItem(overlay);
495 // if there is a stack of popups, and the current top popup item belongs to an
496 // ancestor of this popup, then make sure that this popup's item is at the top
497 // of the stack.
498 const QQuickPopup *topPopup = popupStack.isEmpty() ? nullptr : popupStack.first();
499 const QObject *ancestor = q;
500 while (ancestor && topPopup) {
501 if (ancestor == topPopup)
502 break;
503 ancestor = ancestor->parent();
504 }
505 if (topPopup && topPopup != q && ancestor) {
506 QQuickItem *topPopupItem = popupStack.first()->popupItem();
507 popupItem->stackAfter(topPopupItem);
508 // If the popup doesn't have an explicit z value set, set it to be at least as
509 // high as the current top popup item so that later opened popups are on top.
510 if (!hasZ)
511 popupItem->setZ(qMax(topPopupItem->z(), popupItem->z()));
512 }
513 if (dim)
515 showOverlay();
516 emit q->aboutToShow();
517 visible = true;
519 popupItem->setVisible(true);
521 emit q->visibleChanged();
522
523 auto *overlayPrivate = QQuickOverlayPrivate::get(overlay);
524 if (overlayPrivate->lastActiveFocusItem.isNull())
525 overlayPrivate->lastActiveFocusItem = window->activeFocusItem();
526
527 if (focus)
529 }
530 return true;
531}
532
534{
535 Q_Q(QQuickPopup);
537 return false;
538
539 // We need to cache the original scale and opacity values so we can reset it after
540 // the exit transition is done so they have the original values again
543
545 // The setFocus(false) call below removes any active focus before we're
546 // able to check it in finalizeExitTransition.
549 if (focus)
552 hideOverlay();
553 emit q->aboutToHide();
554 emit q->openedChanged();
555 }
556 return true;
557}
558
560{
561 Q_Q(QQuickPopup);
564 emit q->openedChanged();
565 opened();
566}
567
569{
570 Q_Q(QQuickPopup);
571 getPositioner()->setParentItem(nullptr);
572 if (popupItem) {
573 popupItem->setParentItem(nullptr);
574 popupItem->setVisible(false);
575 }
577
579 // restore focus to the next popup in chain, or to the window content if there are no other popups open
580 QQuickPopup *nextFocusPopup = nullptr;
582 const auto stackingOrderPopups = QQuickOverlayPrivate::get(overlay)->stackingOrderPopups();
583 for (auto popup : stackingOrderPopups) {
585 && popup->hasFocus()) {
586 nextFocusPopup = popup;
587 break;
588 }
589 }
590 }
591 if (nextFocusPopup) {
592 nextFocusPopup->forceActiveFocus(Qt::PopupFocusReason);
593 } else {
594 auto *appWindow = qobject_cast<QQuickApplicationWindow*>(window);
595 auto *contentItem = appWindow ? appWindow->contentItem() : window->contentItem();
596 auto *overlay = QQuickOverlay::overlay(window);
597 auto *overlayPrivate = QQuickOverlayPrivate::get(overlay);
598 if (!contentItem->scopedFocusItem()
599 && !overlayPrivate->lastActiveFocusItem.isNull()) {
600 overlayPrivate->lastActiveFocusItem->setFocus(true, Qt::OtherFocusReason);
601 } else {
602 contentItem->setFocus(true, Qt::PopupFocusReason);
603 }
604 overlayPrivate->lastActiveFocusItem = nullptr;
605 }
606 }
607
608 visible = false;
611 emit q->visibleChanged();
612 emit q->closed();
613 if (popupItem) {
616 }
617}
618
620{
621 Q_Q(QQuickPopup);
622 emit q->opened();
623}
624
626{
627 Q_Q(const QQuickPopup);
628 return QMarginsF(q->leftMargin(), q->topMargin(), q->rightMargin(), q->bottomMargin());
629}
630
632{
633 Q_Q(QQuickPopup);
634 qreal oldMargin = q->topMargin();
637 if ((!reset && !qFuzzyCompare(oldMargin, value)) || (reset && !qFuzzyCompare(oldMargin, margins))) {
638 emit q->topMarginChanged();
641 }
642}
643
645{
646 Q_Q(QQuickPopup);
647 qreal oldMargin = q->leftMargin();
650 if ((!reset && !qFuzzyCompare(oldMargin, value)) || (reset && !qFuzzyCompare(oldMargin, margins))) {
651 emit q->leftMarginChanged();
654 }
655}
656
658{
659 Q_Q(QQuickPopup);
660 qreal oldMargin = q->rightMargin();
663 if ((!reset && !qFuzzyCompare(oldMargin, value)) || (reset && !qFuzzyCompare(oldMargin, margins))) {
664 emit q->rightMarginChanged();
667 }
668}
669
671{
672 Q_Q(QQuickPopup);
673 qreal oldMargin = q->bottomMargin();
676 if ((!reset && !qFuzzyCompare(oldMargin, value)) || (reset && !qFuzzyCompare(oldMargin, margins))) {
677 emit q->bottomMarginChanged();
680 }
681}
682
717{
718 Q_Q(QQuickPopup);
719 if (!anchors)
721 return anchors;
722}
723
725{
726 Q_Q(QQuickPopup);
727 if (!positioner)
729 return positioner;
730}
731
733{
734 Q_Q(QQuickPopup);
735 if (window == newWindow)
736 return;
737
738 if (window) {
740 if (overlay)
742 }
743
744 window = newWindow;
745
746 if (newWindow) {
747 QQuickOverlay *overlay = QQuickOverlay::overlay(newWindow);
748 if (overlay)
750
752 p->resolveFont();
753 if (QQuickApplicationWindow *appWindow = qobject_cast<QQuickApplicationWindow *>(newWindow))
754 p->updateLocale(appWindow->locale(), false); // explicit=false
755 }
756
757 emit q->windowChanged(newWindow);
758
759 if (complete && visible && window)
761}
762
764{
765 Q_Q(QQuickPopup);
766 if (item == parentItem)
767 q->setParentItem(nullptr);
768}
769
771{
773}
774
776{
778}
779
781{
782 QQuickItem *item = nullptr;
783 if (component) {
784 QQmlContext *context = component->creationContext();
785 if (!context)
786 context = qmlContext(popup);
788 }
789
790 // when there is no overlay component available (with plain QQuickWindow),
791 // use a plain QQuickItem as a fallback to block hover events
792 if (!item && popup->isModal())
793 item = new QQuickItem;
794
795 if (item) {
796 item->setOpacity(popup->isVisible() ? 1.0 : 0.0);
798 item->stackBefore(popup->popupItem());
799 item->setZ(popup->z());
800 // needed for the virtual keyboard to set a containment mask on the dimmer item
801 qCDebug(lcDimmer) << "dimmer" << item << "registered with" << parent;
802 parent->setProperty("_q_dimmerItem", QVariant::fromValue<QQuickItem*>(item));
803 if (popup->isModal()) {
805#if QT_CONFIG(cursor)
807#endif
808#if QT_CONFIG(quicktemplates2_hover)
809 // TODO: switch to QStyleHints::useHoverEffects in Qt 5.8
811 // item->setAcceptHoverEvents(QGuiApplication::styleHints()->useHoverEffects());
812 // connect(QGuiApplication::styleHints(), &QStyleHints::useHoverEffectsChanged, item, &QQuickItem::setAcceptHoverEvents);
813#endif
814 }
815 if (component)
816 component->completeCreate();
817 }
818 qCDebug(lcDimmer) << "finished creating dimmer from component" << component
819 << "for popup" << popup << "with parent" << parent << "- item is:" << item;
820 return item;
821}
822
824{
825 Q_Q(QQuickPopup);
827 if (!overlay)
828 return;
829
830 QQmlComponent *component = nullptr;
831 QQuickOverlayAttached *overlayAttached = qobject_cast<QQuickOverlayAttached *>(qmlAttachedPropertiesObject<QQuickOverlay>(q, false));
832 if (overlayAttached)
833 component = modal ? overlayAttached->modal() : overlayAttached->modeless();
834
835 if (!component)
836 component = modal ? overlay->modal() : overlay->modeless();
837
838 if (!dimmer)
839 dimmer = createDimmer(component, q, overlay);
841}
842
844{
845 if (dimmer) {
846 qCDebug(lcDimmer) << "destroying dimmer" << dimmer;
847 if (QObject *dimmerParentItem = dimmer->parentItem()) {
848 if (dimmerParentItem->property("_q_dimmerItem").value<QQuickItem*>() == dimmer)
849 dimmerParentItem->setProperty("_q_dimmerItem", QVariant());
850 }
851 dimmer->setParentItem(nullptr);
853 dimmer = nullptr;
854 }
855}
856
858{
860 if (dim)
862}
863
865{
866 // Inherit parent palette to all child objects
868
869 // Inherit parent palette to items within popup (such as headers and footers)
871}
872
874{
875 // use QQmlProperty instead of QQuickItem::setOpacity() to trigger QML Behaviors
876 if (dim && dimmer)
877 QQmlProperty::write(dimmer, QStringLiteral("opacity"), 1.0);
878}
879
881{
882 // use QQmlProperty instead of QQuickItem::setOpacity() to trigger QML Behaviors
883 if (dim && dimmer)
884 QQmlProperty::write(dimmer, QStringLiteral("opacity"), 0.0);
885}
886
888{
889 if (!dimmer)
890 return;
891
892 qreal w = window ? window->width() : 0;
893 qreal h = window ? window->height() : 0;
894 dimmer->setSize(QSizeF(w, h));
895}
896
898 : popup(popup)
899{
900}
901
903{
905 cancel();
906
907 if (!popup->prepareEnterTransition())
908 return;
909
910 if (popup->window)
911 transition(popup->enterActions, popup->enter, popup->q_func());
912 else
913 finished();
914}
915
917{
918 if (!popup->prepareExitTransition())
919 return;
920
921 if (popup->window)
922 transition(popup->exitActions, popup->exit, popup->q_func());
923 else
924 finished();
925}
926
928{
932 popup->finalizeExitTransition();
933}
934
937{
938 Q_D(QQuickPopup);
939 d->init();
940}
941
943 : QObject(dd, parent)
944{
945 Q_D(QQuickPopup);
946 d->init();
947}
948
949QQuickPopup::~QQuickPopup()
950{
951 Q_D(QQuickPopup);
952 d->inDestructor = true;
953
954 QQuickItem *currentContentItem = d->popupItem->d_func()->contentItem.data();
955 if (currentContentItem) {
956 disconnect(currentContentItem, &QQuickItem::childrenChanged,
958 }
959
960 setParentItem(nullptr);
961
962 // If the popup is destroyed before the exit transition finishes,
963 // the necessary cleanup (removing modal dimmers that block mouse events,
964 // emitting closed signal, etc.) won't happen. That's why we do it manually here.
965 if (d->transitionState == QQuickPopupPrivate::ExitTransition && d->transitionManager.isRunning())
966 d->finalizeExitTransition();
967
968 delete d->popupItem;
969 d->popupItem = nullptr;
970 delete d->positioner;
971 d->positioner = nullptr;
972}
973
982{
983 setVisible(true);
984}
985
994{
995 setVisible(false);
996}
997
1005qreal QQuickPopup::x() const
1006{
1007 Q_D(const QQuickPopup);
1008 return d->effectiveX;
1009}
1010
1011void QQuickPopup::setX(qreal x)
1012{
1013 Q_D(QQuickPopup);
1014 setPosition(QPointF(x, d->y));
1015}
1016
1024qreal QQuickPopup::y() const
1025{
1026 Q_D(const QQuickPopup);
1027 return d->effectiveY;
1028}
1029
1030void QQuickPopup::setY(qreal y)
1031{
1032 Q_D(QQuickPopup);
1033 setPosition(QPointF(d->x, y));
1034}
1035
1036QPointF QQuickPopup::position() const
1037{
1038 Q_D(const QQuickPopup);
1039 return QPointF(d->effectiveX, d->effectiveY);
1040}
1041
1042void QQuickPopup::setPosition(const QPointF &pos)
1043{
1044 Q_D(QQuickPopup);
1045 const bool xChange = !qFuzzyCompare(d->x, pos.x());
1046 const bool yChange = !qFuzzyCompare(d->y, pos.y());
1047 if (!xChange && !yChange)
1048 return;
1049
1050 d->x = pos.x();
1051 d->y = pos.y();
1052 if (d->popupItem->isVisible()) {
1053 d->reposition();
1054 } else {
1055 if (xChange)
1056 emit xChanged();
1057 if (yChange)
1058 emit yChanged();
1059 }
1060}
1061
1079qreal QQuickPopup::z() const
1080{
1081 Q_D(const QQuickPopup);
1082 return d->popupItem->z();
1083}
1084
1085void QQuickPopup::setZ(qreal z)
1086{
1087 Q_D(QQuickPopup);
1088 d->hasZ = true;
1089 if (qFuzzyCompare(z, d->popupItem->z()))
1090 return;
1091 d->popupItem->setZ(z);
1092 emit zChanged();
1093}
1094
1095void QQuickPopup::resetZ()
1096{
1097 Q_D(QQuickPopup);
1098 setZ(0);
1099 d->hasZ = false;
1100}
1101
1108{
1109 Q_D(const QQuickPopup);
1110 return d->popupItem->width();
1111}
1112
1113void QQuickPopup::setWidth(qreal width)
1114{
1115 Q_D(QQuickPopup);
1116 d->hasWidth = true;
1117 d->popupItem->setWidth(width);
1118}
1119
1120void QQuickPopup::resetWidth()
1121{
1122 Q_D(QQuickPopup);
1123 if (!d->hasWidth)
1124 return;
1125
1126 d->hasWidth = false;
1127 d->popupItem->resetWidth();
1128 if (d->popupItem->isVisible())
1129 d->reposition();
1130}
1131
1138{
1139 Q_D(const QQuickPopup);
1140 return d->popupItem->height();
1141}
1142
1143void QQuickPopup::setHeight(qreal height)
1144{
1145 Q_D(QQuickPopup);
1146 d->hasHeight = true;
1147 d->popupItem->setHeight(height);
1148}
1149
1150void QQuickPopup::resetHeight()
1151{
1152 Q_D(QQuickPopup);
1153 if (!d->hasHeight)
1154 return;
1155
1156 d->hasHeight = false;
1157 d->popupItem->resetHeight();
1158 if (d->popupItem->isVisible())
1159 d->reposition();
1160}
1161
1168{
1169 Q_D(const QQuickPopup);
1170 return d->popupItem->implicitWidth();
1171}
1172
1173void QQuickPopup::setImplicitWidth(qreal width)
1174{
1175 Q_D(QQuickPopup);
1176 d->popupItem->setImplicitWidth(width);
1177}
1178
1185{
1186 Q_D(const QQuickPopup);
1187 return d->popupItem->implicitHeight();
1188}
1189
1190void QQuickPopup::setImplicitHeight(qreal height)
1191{
1192 Q_D(QQuickPopup);
1193 d->popupItem->setImplicitHeight(height);
1194}
1195
1207{
1208 Q_D(const QQuickPopup);
1209 return d->popupItem->contentWidth();
1210}
1211
1212void QQuickPopup::setContentWidth(qreal width)
1213{
1214 Q_D(QQuickPopup);
1215 d->popupItem->setContentWidth(width);
1216}
1217
1229{
1230 Q_D(const QQuickPopup);
1231 return d->popupItem->contentHeight();
1232}
1233
1234void QQuickPopup::setContentHeight(qreal height)
1235{
1236 Q_D(QQuickPopup);
1237 d->popupItem->setContentHeight(height);
1238}
1239
1250{
1251 Q_D(const QQuickPopup);
1252 return d->popupItem->availableWidth();
1253}
1254
1265{
1266 Q_D(const QQuickPopup);
1267 return d->popupItem->availableHeight();
1268}
1269
1283{
1284 Q_D(const QQuickPopup);
1285 return d->popupItem->spacing();
1286}
1287
1288void QQuickPopup::setSpacing(qreal spacing)
1289{
1290 Q_D(QQuickPopup);
1291 d->popupItem->setSpacing(spacing);
1292}
1293
1294void QQuickPopup::resetSpacing()
1295{
1296 setSpacing(0);
1297}
1298
1311{
1312 Q_D(const QQuickPopup);
1313 return d->margins;
1314}
1315
1316void QQuickPopup::setMargins(qreal margins)
1317{
1318 Q_D(QQuickPopup);
1319 if (qFuzzyCompare(d->margins, margins))
1320 return;
1321 QMarginsF oldMargins(leftMargin(), topMargin(), rightMargin(), bottomMargin());
1322 d->margins = margins;
1324 QMarginsF newMargins(leftMargin(), topMargin(), rightMargin(), bottomMargin());
1325 if (!qFuzzyCompare(newMargins.top(), oldMargins.top()))
1327 if (!qFuzzyCompare(newMargins.left(), oldMargins.left()))
1329 if (!qFuzzyCompare(newMargins.right(), oldMargins.right()))
1331 if (!qFuzzyCompare(newMargins.bottom(), oldMargins.bottom()))
1333 marginsChange(newMargins, oldMargins);
1334}
1335
1336void QQuickPopup::resetMargins()
1337{
1338 setMargins(-1);
1339}
1340
1353{
1354 Q_D(const QQuickPopup);
1355 if (d->hasTopMargin)
1356 return d->topMargin;
1357 return d->margins;
1358}
1359
1360void QQuickPopup::setTopMargin(qreal margin)
1361{
1362 Q_D(QQuickPopup);
1363 d->setTopMargin(margin);
1364}
1365
1366void QQuickPopup::resetTopMargin()
1367{
1368 Q_D(QQuickPopup);
1369 d->setTopMargin(-1, true);
1370}
1371
1384{
1385 Q_D(const QQuickPopup);
1386 if (d->hasLeftMargin)
1387 return d->leftMargin;
1388 return d->margins;
1389}
1390
1391void QQuickPopup::setLeftMargin(qreal margin)
1392{
1393 Q_D(QQuickPopup);
1394 d->setLeftMargin(margin);
1395}
1396
1397void QQuickPopup::resetLeftMargin()
1398{
1399 Q_D(QQuickPopup);
1400 d->setLeftMargin(-1, true);
1401}
1402
1415{
1416 Q_D(const QQuickPopup);
1417 if (d->hasRightMargin)
1418 return d->rightMargin;
1419 return d->margins;
1420}
1421
1422void QQuickPopup::setRightMargin(qreal margin)
1423{
1424 Q_D(QQuickPopup);
1425 d->setRightMargin(margin);
1426}
1427
1428void QQuickPopup::resetRightMargin()
1429{
1430 Q_D(QQuickPopup);
1431 d->setRightMargin(-1, true);
1432}
1433
1446{
1447 Q_D(const QQuickPopup);
1448 if (d->hasBottomMargin)
1449 return d->bottomMargin;
1450 return d->margins;
1451}
1452
1453void QQuickPopup::setBottomMargin(qreal margin)
1454{
1455 Q_D(QQuickPopup);
1456 d->setBottomMargin(margin);
1457}
1458
1459void QQuickPopup::resetBottomMargin()
1460{
1461 Q_D(QQuickPopup);
1462 d->setBottomMargin(-1, true);
1463}
1464
1475{
1476 Q_D(const QQuickPopup);
1477 return d->popupItem->padding();
1478}
1479
1480void QQuickPopup::setPadding(qreal padding)
1481{
1482 Q_D(QQuickPopup);
1483 d->popupItem->setPadding(padding);
1484}
1485
1486void QQuickPopup::resetPadding()
1487{
1488 Q_D(QQuickPopup);
1489 d->popupItem->resetPadding();
1490}
1491
1503{
1504 Q_D(const QQuickPopup);
1505 return d->popupItem->topPadding();
1506}
1507
1508void QQuickPopup::setTopPadding(qreal padding)
1509{
1510 Q_D(QQuickPopup);
1511 d->popupItem->setTopPadding(padding);
1512}
1513
1514void QQuickPopup::resetTopPadding()
1515{
1516 Q_D(QQuickPopup);
1517 d->popupItem->resetTopPadding();
1518}
1519
1531{
1532 Q_D(const QQuickPopup);
1533 return d->popupItem->leftPadding();
1534}
1535
1536void QQuickPopup::setLeftPadding(qreal padding)
1537{
1538 Q_D(QQuickPopup);
1539 d->popupItem->setLeftPadding(padding);
1540}
1541
1542void QQuickPopup::resetLeftPadding()
1543{
1544 Q_D(QQuickPopup);
1545 d->popupItem->resetLeftPadding();
1546}
1547
1559{
1560 Q_D(const QQuickPopup);
1561 return d->popupItem->rightPadding();
1562}
1563
1564void QQuickPopup::setRightPadding(qreal padding)
1565{
1566 Q_D(QQuickPopup);
1567 d->popupItem->setRightPadding(padding);
1568}
1569
1570void QQuickPopup::resetRightPadding()
1571{
1572 Q_D(QQuickPopup);
1573 d->popupItem->resetRightPadding();
1574}
1575
1587{
1588 Q_D(const QQuickPopup);
1589 return d->popupItem->bottomPadding();
1590}
1591
1592void QQuickPopup::setBottomPadding(qreal padding)
1593{
1594 Q_D(QQuickPopup);
1595 d->popupItem->setBottomPadding(padding);
1596}
1597
1598void QQuickPopup::resetBottomPadding()
1599{
1600 Q_D(QQuickPopup);
1601 d->popupItem->resetBottomPadding();
1602}
1603
1612{
1613 Q_D(const QQuickPopup);
1614 return d->popupItem->locale();
1615}
1616
1617void QQuickPopup::setLocale(const QLocale &locale)
1618{
1619 Q_D(QQuickPopup);
1620 d->popupItem->setLocale(locale);
1621}
1622
1623void QQuickPopup::resetLocale()
1624{
1625 Q_D(QQuickPopup);
1626 d->popupItem->resetLocale();
1627}
1628
1642bool QQuickPopup::isMirrored() const
1643{
1644 Q_D(const QQuickPopup);
1645 return d->popupItem->isMirrored();
1646}
1647
1676{
1677 Q_D(const QQuickPopup);
1678 return d->popupItem->font();
1679}
1680
1681void QQuickPopup::setFont(const QFont &font)
1682{
1683 Q_D(QQuickPopup);
1684 d->popupItem->setFont(font);
1685}
1686
1687void QQuickPopup::resetFont()
1688{
1689 Q_D(QQuickPopup);
1690 d->popupItem->resetFont();
1691}
1692
1693QQuickWindow *QQuickPopup::window() const
1694{
1695 Q_D(const QQuickPopup);
1696 return d->window;
1697}
1698
1699QQuickItem *QQuickPopup::popupItem() const
1700{
1701 Q_D(const QQuickPopup);
1702 return d->popupItem;
1703}
1704
1710QQuickItem *QQuickPopup::parentItem() const
1711{
1712 Q_D(const QQuickPopup);
1713 return d->parentItem;
1714}
1715
1716void QQuickPopup::setParentItem(QQuickItem *parent)
1717{
1718 Q_D(QQuickPopup);
1719 if (d->parentItem == parent)
1720 return;
1721
1722 if (d->parentItem) {
1723 QObjectPrivate::disconnect(d->parentItem, &QQuickItem::windowChanged, d, &QQuickPopupPrivate::setWindow);
1725 }
1726 d->parentItem = parent;
1727 QQuickPopupPositioner *positioner = d->getPositioner();
1728 if (positioner->parentItem())
1729 positioner->setParentItem(parent);
1730 if (parent) {
1731 QObjectPrivate::connect(parent, &QQuickItem::windowChanged, d, &QQuickPopupPrivate::setWindow);
1733 } else if (!d->inDestructor) {
1734 // NOTE: if setParentItem is called from the dtor, this bypasses virtual dispatch and calls QQuickPopup::close() directly
1735 close();
1736 }
1737 d->setWindow(parent ? parent->window() : nullptr);
1739}
1740
1741void QQuickPopup::resetParentItem()
1742{
1743 if (QQuickWindow *window = qobject_cast<QQuickWindow *>(parent()))
1744 setParentItem(window->contentItem());
1745 else
1746 setParentItem(qobject_cast<QQuickItem *>(parent()));
1747}
1748
1767{
1768 Q_D(const QQuickPopup);
1769 return d->popupItem->background();
1770}
1771
1772void QQuickPopup::setBackground(QQuickItem *background)
1773{
1774 Q_D(QQuickPopup);
1775 // The __notCustomizable property won't be on "this" when the popup item's setBackground function
1776 // is called, so it won't warn. That's why we do a check here.
1778 d->popupItem->setBackground(background);
1779}
1780
1802{
1803 Q_D(const QQuickPopup);
1804 return d->popupItem->contentItem();
1805}
1806
1807void QQuickPopup::setContentItem(QQuickItem *item)
1808{
1809 Q_D(QQuickPopup);
1810 // See comment in setBackground for why we do this.
1812 QQuickItem *oldContentItem = d->complete ? d->popupItem->d_func()->contentItem.data()
1813 : nullptr;
1814 if (oldContentItem)
1816 d->popupItem->setContentItem(item);
1817 if (d->complete) {
1818 QQuickItem *newContentItem = d->popupItem->d_func()->contentItem.data();
1820 if (oldContentItem != newContentItem)
1822 }
1823}
1824
1840{
1842 if (!p->contentItem)
1843 p->executeContentItem();
1849}
1850
1865{
1871}
1872
1878bool QQuickPopup::clip() const
1879{
1880 Q_D(const QQuickPopup);
1881 return d->popupItem->clip();
1882}
1883
1884void QQuickPopup::setClip(bool clip)
1885{
1886 Q_D(QQuickPopup);
1887 if (clip == d->popupItem->clip())
1888 return;
1889 d->popupItem->setClip(clip);
1890 emit clipChanged();
1891}
1892
1905bool QQuickPopup::hasFocus() const
1906{
1907 Q_D(const QQuickPopup);
1908 return d->focus;
1909}
1910
1911void QQuickPopup::setFocus(bool focus)
1912{
1913 Q_D(QQuickPopup);
1914 if (d->focus == focus)
1915 return;
1916 d->focus = focus;
1918}
1919
1928bool QQuickPopup::hasActiveFocus() const
1929{
1930 Q_D(const QQuickPopup);
1931 return d->popupItem->hasActiveFocus();
1932}
1933
1955bool QQuickPopup::isModal() const
1956{
1957 Q_D(const QQuickPopup);
1958 return d->modal;
1959}
1960
1961void QQuickPopup::setModal(bool modal)
1962{
1963 Q_D(QQuickPopup);
1964 if (d->modal == modal)
1965 return;
1966 d->modal = modal;
1967 if (d->complete && d->visible)
1968 d->toggleOverlay();
1970
1972
1973 if (!d->hasDim) {
1974 setDim(modal);
1975 d->hasDim = false;
1976 }
1977}
1978
1989bool QQuickPopup::dim() const
1990{
1991 Q_D(const QQuickPopup);
1992 return d->dim;
1993}
1994
1995void QQuickPopup::setDim(bool dim)
1996{
1997 Q_D(QQuickPopup);
1998 d->hasDim = true;
1999
2000 if (d->dim == dim)
2001 return;
2002
2003 d->dim = dim;
2004 if (d->complete && d->visible)
2005 d->toggleOverlay();
2006 emit dimChanged();
2007}
2008
2009void QQuickPopup::resetDim()
2010{
2011 Q_D(QQuickPopup);
2012 if (!d->hasDim)
2013 return;
2014
2015 setDim(d->modal);
2016 d->hasDim = false;
2017}
2018
2026bool QQuickPopup::isVisible() const
2027{
2028 Q_D(const QQuickPopup);
2029 return d->visible && d->popupItem->isVisible();
2030}
2031
2032void QQuickPopup::setVisible(bool visible)
2033{
2034 Q_D(QQuickPopup);
2035 if (d->visible == visible && d->transitionState != QQuickPopupPrivate::ExitTransition)
2036 return;
2037
2038 if (d->complete) {
2039 if (visible)
2040 d->transitionManager.transitionEnter();
2041 else
2042 d->transitionManager.transitionExit();
2043 } else {
2044 d->visible = visible;
2045 }
2046}
2047
2056bool QQuickPopup::isEnabled() const
2057{
2058 Q_D(const QQuickPopup);
2059 return d->popupItem->isEnabled();
2060}
2061
2062void QQuickPopup::setEnabled(bool enabled)
2063{
2064 Q_D(QQuickPopup);
2065 d->popupItem->setEnabled(enabled);
2066}
2067
2077bool QQuickPopup::isOpened() const
2078{
2079 Q_D(const QQuickPopup);
2080 return d->transitionState == QQuickPopupPrivate::NoTransition && isVisible();
2081}
2082
2092{
2093 Q_D(const QQuickPopup);
2094 return d->popupItem->opacity();
2095}
2096
2097void QQuickPopup::setOpacity(qreal opacity)
2098{
2099 Q_D(QQuickPopup);
2100 d->popupItem->setOpacity(opacity);
2101}
2102
2113{
2114 Q_D(const QQuickPopup);
2115 return d->popupItem->scale();
2116}
2117
2118void QQuickPopup::setScale(qreal scale)
2119{
2120 Q_D(QQuickPopup);
2121 if (qFuzzyCompare(scale, d->popupItem->scale()))
2122 return;
2123 d->popupItem->setScale(scale);
2125}
2126
2153QQuickPopup::ClosePolicy QQuickPopup::closePolicy() const
2154{
2155 Q_D(const QQuickPopup);
2156 return d->closePolicy;
2157}
2158
2159void QQuickPopup::setClosePolicy(ClosePolicy policy)
2160{
2161 Q_D(QQuickPopup);
2162 d->hasClosePolicy = true;
2163 if (d->closePolicy == policy)
2164 return;
2165 d->closePolicy = policy;
2167}
2168
2169void QQuickPopup::resetClosePolicy()
2170{
2171 Q_D(QQuickPopup);
2173 d->hasClosePolicy = false;
2174}
2175
2188QQuickPopup::TransformOrigin QQuickPopup::transformOrigin() const
2189{
2190 Q_D(const QQuickPopup);
2191 return static_cast<TransformOrigin>(d->popupItem->transformOrigin());
2192}
2193
2194void QQuickPopup::setTransformOrigin(TransformOrigin origin)
2195{
2196 Q_D(QQuickPopup);
2197 d->popupItem->setTransformOrigin(static_cast<QQuickItem::TransformOrigin>(origin));
2198}
2199
2219{
2220 Q_D(const QQuickPopup);
2221 return d->enter;
2222}
2223
2224void QQuickPopup::setEnter(QQuickTransition *transition)
2225{
2226 Q_D(QQuickPopup);
2227 if (d->enter == transition)
2228 return;
2229 d->enter = transition;
2231}
2232
2252{
2253 Q_D(const QQuickPopup);
2254 return d->exit;
2255}
2256
2257void QQuickPopup::setExit(QQuickTransition *transition)
2258{
2259 Q_D(QQuickPopup);
2260 if (d->exit == transition)
2261 return;
2262 d->exit = transition;
2263 emit exitChanged();
2264}
2265
2277qreal QQuickPopup::horizontalPadding() const
2278{
2279 Q_D(const QQuickPopup);
2280 return d->popupItem->horizontalPadding();
2281}
2282
2283void QQuickPopup::setHorizontalPadding(qreal padding)
2284{
2285 Q_D(QQuickPopup);
2286 d->popupItem->setHorizontalPadding(padding);
2287}
2288
2289void QQuickPopup::resetHorizontalPadding()
2290{
2291 Q_D(QQuickPopup);
2292 d->popupItem->resetHorizontalPadding();
2293}
2294
2306qreal QQuickPopup::verticalPadding() const
2307{
2308 Q_D(const QQuickPopup);
2309 return d->popupItem->verticalPadding();
2310}
2311
2312void QQuickPopup::setVerticalPadding(qreal padding)
2313{
2314 Q_D(QQuickPopup);
2315 d->popupItem->setVerticalPadding(padding);
2316}
2317
2318void QQuickPopup::resetVerticalPadding()
2319{
2320 Q_D(QQuickPopup);
2321 d->popupItem->resetVerticalPadding();
2322}
2323
2335qreal QQuickPopup::implicitContentWidth() const
2336{
2337 Q_D(const QQuickPopup);
2338 return d->popupItem->implicitContentWidth();
2339}
2340
2352qreal QQuickPopup::implicitContentHeight() const
2353{
2354 Q_D(const QQuickPopup);
2355 return d->popupItem->implicitContentHeight();
2356}
2357
2369qreal QQuickPopup::implicitBackgroundWidth() const
2370{
2371 Q_D(const QQuickPopup);
2372 return d->popupItem->implicitBackgroundWidth();
2373}
2374
2386qreal QQuickPopup::implicitBackgroundHeight() const
2387{
2388 Q_D(const QQuickPopup);
2389 return d->popupItem->implicitBackgroundHeight();
2390}
2391
2400qreal QQuickPopup::topInset() const
2401{
2402 Q_D(const QQuickPopup);
2403 return d->popupItem->topInset();
2404}
2405
2406void QQuickPopup::setTopInset(qreal inset)
2407{
2408 Q_D(QQuickPopup);
2409 d->popupItem->setTopInset(inset);
2410}
2411
2412void QQuickPopup::resetTopInset()
2413{
2414 Q_D(QQuickPopup);
2415 d->popupItem->resetTopInset();
2416}
2417
2426qreal QQuickPopup::leftInset() const
2427{
2428 Q_D(const QQuickPopup);
2429 return d->popupItem->leftInset();
2430}
2431
2432void QQuickPopup::setLeftInset(qreal inset)
2433{
2434 Q_D(QQuickPopup);
2435 d->popupItem->setLeftInset(inset);
2436}
2437
2438void QQuickPopup::resetLeftInset()
2439{
2440 Q_D(QQuickPopup);
2441 d->popupItem->resetLeftInset();
2442}
2443
2452qreal QQuickPopup::rightInset() const
2453{
2454 Q_D(const QQuickPopup);
2455 return d->popupItem->rightInset();
2456}
2457
2458void QQuickPopup::setRightInset(qreal inset)
2459{
2460 Q_D(QQuickPopup);
2461 d->popupItem->setRightInset(inset);
2462}
2463
2464void QQuickPopup::resetRightInset()
2465{
2466 Q_D(QQuickPopup);
2467 d->popupItem->resetRightInset();
2468}
2469
2478qreal QQuickPopup::bottomInset() const
2479{
2480 Q_D(const QQuickPopup);
2481 return d->popupItem->bottomInset();
2482}
2483
2484void QQuickPopup::setBottomInset(qreal inset)
2485{
2486 Q_D(QQuickPopup);
2487 d->popupItem->setBottomInset(inset);
2488}
2489
2490void QQuickPopup::resetBottomInset()
2491{
2492 Q_D(QQuickPopup);
2493 d->popupItem->resetBottomInset();
2494}
2495
2525bool QQuickPopup::filtersChildMouseEvents() const
2526{
2527 Q_D(const QQuickPopup);
2528 return d->popupItem->filtersChildMouseEvents();
2529}
2530
2531void QQuickPopup::setFiltersChildMouseEvents(bool filter)
2532{
2533 Q_D(QQuickPopup);
2534 d->popupItem->setFiltersChildMouseEvents(filter);
2535}
2536
2547void QQuickPopup::forceActiveFocus(Qt::FocusReason reason)
2548{
2549 Q_D(QQuickPopup);
2550 d->popupItem->forceActiveFocus(reason);
2551}
2552
2554{
2555 Q_D(QQuickPopup);
2556 d->complete = false;
2558 if (context)
2560 d->popupItem->classBegin();
2561}
2562
2564{
2565 Q_D(QQuickPopup);
2566 qCDebug(lcPopup) << "componentComplete" << this;
2567 if (!parentItem())
2568 resetParentItem();
2569
2570 if (d->visible && d->window)
2571 d->transitionManager.transitionEnter();
2572
2573 d->complete = true;
2574 d->popupItem->componentComplete();
2575
2576 if (auto currentContentItem = d->popupItem->d_func()->contentItem.data()) {
2577 connect(currentContentItem, &QQuickItem::childrenChanged,
2579 }
2580}
2581
2583{
2584 Q_D(const QQuickPopup);
2585 return d->complete;
2586}
2587
2589{
2590 Q_UNUSED(child);
2591 Q_UNUSED(event);
2592 return false;
2593}
2594
2596{
2597 event->accept();
2598}
2599
2601{
2602 event->accept();
2603}
2604
2606{
2607 Q_D(QQuickPopup);
2608 if (!hasActiveFocus())
2609 return;
2610
2611#if QT_CONFIG(shortcut)
2612 if (d->closePolicy.testFlag(QQuickPopup::CloseOnEscape)
2613 && (event->matches(QKeySequence::Cancel)
2614#if defined(Q_OS_ANDROID)
2615 || event->key() == Qt::Key_Back
2616#endif
2617 )) {
2618 event->accept();
2619 if (d->interactive)
2620 d->closeOrReject();
2621 return;
2622 }
2623#endif
2624
2625 if (hasActiveFocus() && (event->key() == Qt::Key_Tab || event->key() == Qt::Key_Backtab)) {
2626 event->accept();
2627 QQuickItemPrivate::focusNextPrev(d->popupItem, event->key() == Qt::Key_Tab);
2628 }
2629}
2630
2632{
2633 event->accept();
2634}
2635
2637{
2638 Q_D(QQuickPopup);
2639 event->setAccepted(d->handleMouseEvent(d->popupItem, event));
2640}
2641
2643{
2644 Q_D(QQuickPopup);
2645 event->setAccepted(d->handleMouseEvent(d->popupItem, event));
2646}
2647
2649{
2650 Q_D(QQuickPopup);
2651 event->setAccepted(d->handleMouseEvent(d->popupItem, event));
2652}
2653
2655{
2656 event->accept();
2657}
2658
2660{
2661 Q_D(QQuickPopup);
2662 d->handleUngrab();
2663}
2664
2666{
2667 Q_D(QQuickPopup);
2668 switch (event->type()) {
2669 case QEvent::KeyPress:
2670 case QEvent::KeyRelease:
2671 case QEvent::MouseMove:
2672 case QEvent::Wheel:
2673 if (d->modal)
2674 event->accept();
2675 return d->modal;
2676
2677#if QT_CONFIG(quicktemplates2_multitouch)
2678 case QEvent::TouchBegin:
2680 case QEvent::TouchEnd:
2681 return d->handleTouchEvent(item, static_cast<QTouchEvent *>(event));
2682#endif
2683 case QEvent::HoverEnter:
2684 case QEvent::HoverMove:
2685 case QEvent::HoverLeave:
2686 return d->handleHoverEvent(item, static_cast<QHoverEvent *>(event));
2687
2690 return d->handleMouseEvent(item, static_cast<QMouseEvent *>(event));
2691
2692 default:
2693 return false;
2694 }
2695}
2696
2697#if QT_CONFIG(quicktemplates2_multitouch)
2698void QQuickPopup::touchEvent(QTouchEvent *event)
2699{
2700 Q_D(QQuickPopup);
2701 d->handleTouchEvent(d->popupItem, event);
2702}
2703
2704void QQuickPopup::touchUngrabEvent()
2705{
2706 Q_D(QQuickPopup);
2707 d->handleUngrab();
2708}
2709#endif
2710
2711#if QT_CONFIG(wheelevent)
2712void QQuickPopup::wheelEvent(QWheelEvent *event)
2713{
2714 event->accept();
2715}
2716#endif
2717
2719{
2720 Q_UNUSED(newItem);
2721 Q_UNUSED(oldItem);
2722}
2723
2724void QQuickPopup::contentSizeChange(const QSizeF &newSize, const QSizeF &oldSize)
2725{
2726 qCDebug(lcPopup) << "contentSizeChange called on" << this << "with newSize" << newSize << "oldSize" << oldSize;
2727 if (!qFuzzyCompare(newSize.width(), oldSize.width()))
2729 if (!qFuzzyCompare(newSize.height(), oldSize.height()))
2731}
2732
2733void QQuickPopup::fontChange(const QFont &newFont, const QFont &oldFont)
2734{
2735 Q_UNUSED(newFont);
2736 Q_UNUSED(oldFont);
2737 emit fontChanged();
2738}
2739
2740void QQuickPopup::geometryChange(const QRectF &newGeometry, const QRectF &oldGeometry)
2741{
2742 Q_D(QQuickPopup);
2743 qCDebug(lcPopup) << "geometryChange called on" << this << "with newGeometry" << newGeometry << "oldGeometry" << oldGeometry;
2744 d->reposition();
2745 if (!qFuzzyCompare(newGeometry.width(), oldGeometry.width())) {
2748 }
2749 if (!qFuzzyCompare(newGeometry.height(), oldGeometry.height())) {
2752 }
2753}
2754
2756{
2757 switch (change) {
2760 break;
2763 break;
2764 default:
2765 break;
2766 }
2767}
2768
2769void QQuickPopup::localeChange(const QLocale &newLocale, const QLocale &oldLocale)
2770{
2771 Q_UNUSED(newLocale);
2772 Q_UNUSED(oldLocale);
2774}
2775
2776void QQuickPopup::marginsChange(const QMarginsF &newMargins, const QMarginsF &oldMargins)
2777{
2778 Q_D(QQuickPopup);
2779 Q_UNUSED(newMargins);
2780 Q_UNUSED(oldMargins);
2781 d->reposition();
2782}
2783
2784void QQuickPopup::paddingChange(const QMarginsF &newPadding, const QMarginsF &oldPadding)
2785{
2786 const bool tp = !qFuzzyCompare(newPadding.top(), oldPadding.top());
2787 const bool lp = !qFuzzyCompare(newPadding.left(), oldPadding.left());
2788 const bool rp = !qFuzzyCompare(newPadding.right(), oldPadding.right());
2789 const bool bp = !qFuzzyCompare(newPadding.bottom(), oldPadding.bottom());
2790
2791 if (tp)
2793 if (lp)
2795 if (rp)
2797 if (bp)
2799
2800 if (lp || rp) {
2801 emit horizontalPaddingChanged();
2803 }
2804 if (tp || bp) {
2805 emit verticalPaddingChanged();
2807 }
2808}
2809
2810void QQuickPopup::spacingChange(qreal newSpacing, qreal oldSpacing)
2811{
2812 Q_UNUSED(newSpacing);
2813 Q_UNUSED(oldSpacing);
2815}
2816
2817void QQuickPopup::insetChange(const QMarginsF &newInset, const QMarginsF &oldInset)
2818{
2819 if (!qFuzzyCompare(newInset.top(), oldInset.top()))
2820 emit topInsetChanged();
2821 if (!qFuzzyCompare(newInset.left(), oldInset.left()))
2822 emit leftInsetChanged();
2823 if (!qFuzzyCompare(newInset.right(), oldInset.right()))
2824 emit rightInsetChanged();
2825 if (!qFuzzyCompare(newInset.bottom(), oldInset.bottom()))
2826 emit bottomInsetChanged();
2827}
2828
2830{
2832}
2833
2834#if QT_CONFIG(accessibility)
2835QAccessible::Role QQuickPopup::effectiveAccessibleRole() const
2836{
2837 auto *attached = qmlAttachedPropertiesObject<QQuickAccessibleAttached>(this, false);
2838
2839 auto role = QAccessible::NoRole;
2840 if (auto *accessibleAttached = qobject_cast<QQuickAccessibleAttached *>(attached))
2841 role = accessibleAttached->role();
2842 if (role == QAccessible::NoRole)
2843 role = accessibleRole();
2844
2845 return role;
2846}
2847
2848QAccessible::Role QQuickPopup::accessibleRole() const
2849{
2850 return QAccessible::Dialog;
2851}
2852
2853void QQuickPopup::accessibilityActiveChanged(bool active)
2854{
2855 Q_UNUSED(active);
2856}
2857#endif
2858
2860{
2861 Q_D(const QQuickPopup);
2862 return d->popupItem->accessibleName();
2863}
2864
2866{
2867 Q_D(QQuickPopup);
2868 d->popupItem->maybeSetAccessibleName(name);
2869}
2870
2872{
2873 Q_D(const QQuickPopup);
2874 return d->popupItem->accessibleProperty(propertyName);
2875}
2876
2877bool QQuickPopup::setAccessibleProperty(const char *propertyName, const QVariant &value)
2878{
2879 Q_D(QQuickPopup);
2880 return d->popupItem->setAccessibleProperty(propertyName, value);
2881}
2882
2884
2885#include "moc_qquickpopup_p.cpp"
virtual void reject()
Hides the modal dialog and sets the result code to Rejected.
Definition qdialog.cpp:635
The QEventPoint class provides information about a point in a QPointerEvent.
Definition qeventpoint.h:20
int id
the ID number of this event point.
Definition qeventpoint.h:25
State state
the current state of the event point.
Definition qeventpoint.h:27
QPointF position
the position of this point.
Definition qeventpoint.h:36
\inmodule QtCore
Definition qcoreevent.h:45
@ KeyRelease
Definition qcoreevent.h:65
@ MouseMove
Definition qcoreevent.h:63
@ KeyPress
Definition qcoreevent.h:64
@ TouchCancel
Definition qcoreevent.h:264
@ MouseButtonPress
Definition qcoreevent.h:60
@ TouchUpdate
Definition qcoreevent.h:242
@ TouchBegin
Definition qcoreevent.h:241
@ HoverLeave
Definition qcoreevent.h:176
@ HoverEnter
Definition qcoreevent.h:175
@ HoverMove
Definition qcoreevent.h:177
@ MouseButtonRelease
Definition qcoreevent.h:61
The QFocusEvent class contains event parameters for widget focus events.
Definition qevent.h:469
\reentrant
Definition qfont.h:20
void setOpacity(qreal opacity)
void setAcceptHoverEvents(bool enabled)
void stackBefore(const QGraphicsItem *sibling)
void setParentItem(QGraphicsItem *parent)
Sets this item's parent item to newParent.
QPointF mapToScene(const QPointF &point) const
Maps the point point, which is in this item's coordinate system, to the scene's coordinate system,...
void setAcceptedMouseButtons(Qt::MouseButtons buttons)
Sets the mouse buttons that this item accepts mouse events for.
void setCursor(const QCursor &cursor)
Sets the current cursor shape for the item to cursor.
\inmodule QtGui
Definition qevent.h:245
The QKeyEvent class describes a key event.
Definition qevent.h:423
\inmodule QtCore
Definition qmargins.h:274
constexpr qreal right() const noexcept
Returns the right margin.
Definition qmargins.h:370
constexpr qreal left() const noexcept
Returns the left margin.
Definition qmargins.h:364
constexpr qreal top() const noexcept
Returns the top margin.
Definition qmargins.h:367
constexpr qreal bottom() const noexcept
Returns the bottom margin.
Definition qmargins.h:373
\inmodule QtGui
Definition qevent.h:195
QObject * parent
Definition qobject.h:61
static QMetaObject::Connection connect(const typename QtPrivate::FunctionPointer< Func1 >::Object *sender, Func1 signal, const typename QtPrivate::FunctionPointer< Func2 >::Object *receiverPrivate, Func2 slot, Qt::ConnectionType type=Qt::AutoConnection)
Definition qobject_p.h:298
static bool disconnect(const typename QtPrivate::FunctionPointer< Func1 >::Object *sender, Func1 signal, const typename QtPrivate::FunctionPointer< Func2 >::Object *receiverPrivate, Func2 slot)
Definition qobject_p.h:327
\inmodule QtCore
Definition qobject.h:90
QObject * parent() const
Returns a pointer to the parent object.
Definition qobject.h:311
static QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *member, Qt::ConnectionType=Qt::AutoConnection)
\threadsafe
Definition qobject.cpp:2823
bool setProperty(const char *name, const QVariant &value)
Sets the value of the object's name property to value.
void deleteLater()
\threadsafe
Definition qobject.cpp:2352
The QPalette class contains color groups for each widget state.
Definition qpalette.h:19
\inmodule QtCore\reentrant
Definition qpoint.h:214
The QQmlComponent class encapsulates a QML component definition.
The QQmlContext class defines a context within a QML engine.
Definition qqmlcontext.h:25
static void setContextForObject(QObject *, QQmlContext *)
Sets the QQmlContext for the object to context.
The QQmlListProperty class allows applications to expose list-like properties of QObject-derived clas...
Definition qqmllist.h:24
bool write(const QVariant &) const
Sets the property value to value.
static void warnIfCustomizationNotSupported(QObject *control, QQuickItem *item, const QString &propertyName)
static QQuickControlPrivate * get(QQuickControl *control)
QQuickItem * contentItem
void contentItemChanged()
void paddingChanged()
void backgroundChanged()
static void data_clear(QQmlListProperty< QObject > *)
static qsizetype children_count(QQmlListProperty< QQuickItem > *)
void removeItemChangeListener(QQuickItemChangeListener *, ChangeTypes types)
static void children_clear(QQmlListProperty< QQuickItem > *)
static qsizetype data_count(QQmlListProperty< QObject > *)
\qmlproperty list<QtObject> QtQuick::Item::data \qmldefault
static QQuickItem * children_at(QQmlListProperty< QQuickItem > *, qsizetype)
static QObject * data_at(QQmlListProperty< QObject > *, qsizetype)
static void children_append(QQmlListProperty< QQuickItem > *, QQuickItem *)
static bool focusNextPrev(QQuickItem *item, bool forward)
QQuickItemPrivate::focusNextPrev focuses the next/prev item in the tab-focus-chain.
void addItemChangeListener(QQuickItemChangeListener *listener, ChangeTypes types)
static void data_append(QQmlListProperty< QObject > *, QObject *)
static QQuickItemPrivate * get(QQuickItem *item)
The QQuickItem class provides the most basic of all visual items in \l {Qt Quick}.
Definition qquickitem.h:64
void setOpacity(qreal)
void setFocus(bool)
void setSize(const QSizeF &size)
TransformOrigin
\variable QQuickItem::ItemChangeData::realValue The numeric value that has changed: \l {QQuickItem::o...
Definition qquickitem.h:170
void setScale(qreal)
void setParentItem(QQuickItem *parent)
qreal z
\qmlproperty real QtQuick::Item::z
Definition qquickitem.h:75
QPointF mapFromScene(const QPointF &point) const
Maps the given point in the scene's coordinate system to the equivalent point within this item's coor...
bool hasActiveFocus() const
virtual Q_INVOKABLE bool contains(const QPointF &point) const
\qmlmethod bool QtQuick::Item::contains(point point)
QQuickWindow * window() const
Returns the window in which this item is rendered.
QQuickItem * parentItem() const
void stackAfter(const QQuickItem *)
Moves the specified sibling item to the index after this item within the list of children.
void setVisible(bool)
void childrenChanged()
void setZ(qreal)
qreal scale
\qmlproperty real QtQuick::Item::scale This property holds the scale factor for this item.
Definition qquickitem.h:106
ItemChange
Used in conjunction with QQuickItem::itemChange() to notify the item about certain types of changes.
Definition qquickitem.h:143
@ ItemActiveFocusHasChanged
Definition qquickitem.h:150
@ ItemOpacityHasChanged
Definition qquickitem.h:149
qreal opacity
\qmlproperty real QtQuick::Item::opacity
Definition qquickitem.h:79
bool isAncestorOf(const QQuickItem *child) const
Returns true if this item is an ancestor of child (i.e., if this item is child's parent,...
QQmlComponent * modeless
QQmlComponent * modal
QList< QQuickPopup * > stackingOrderPopups() const
A window overlay for popups.
void removePopup(QQuickPopup *popup)
void addPopup(QQuickPopup *popup)
static QQuickOverlayPrivate * get(QQuickOverlay *overlay)
static QQuickOverlay * overlay(QQuickWindow *window)
QQmlComponent * modeless
QQmlComponent * modal
virtual void updateChildrenPalettes(const QPalette &parentPalette)
void setParentItem(QQuickItem *parent)
QQuickItem * parentItem() const
virtual bool handlePress(QQuickItem *item, const QPointF &point, ulong timestamp)
static const QQuickPopup::ClosePolicy DefaultClosePolicy
Base type of popup-like user interface controls.
bool handleMouseEvent(QQuickItem *item, QMouseEvent *event)
TransitionState transitionState
virtual void showOverlay()
void setTopMargin(qreal value, bool reset=false)
virtual bool handleMove(QQuickItem *item, const QPointF &point, ulong timestamp)
QList< QQuickStateAction > enterActions
virtual bool blockInput(QQuickItem *item, const QPointF &point) const
virtual bool handleRelease(QQuickItem *item, const QPointF &point, ulong timestamp)
bool tryClose(const QPointF &pos, QQuickPopup::ClosePolicy flags)
virtual void finalizeExitTransition()
QQmlListProperty< QObject > contentData()
\qmlproperty list<QtObject> QtQuick.Controls::Popup::contentData \qmldefault
virtual void opened()
QQuickItem * parentItem
void itemDestroyed(QQuickItem *item) override
QQuickTransition * enter
QQuickPopupPositioner * positioner
QPointer< QQuickWindow > window
QQuickPopup::ClosePolicy closePolicy
bool handleHoverEvent(QQuickItem *item, QHoverEvent *event)
QQuickPopupAnchors * getAnchors()
QList< QQuickStateAction > exitActions
virtual void handleUngrab()
QQmlListProperty< QQuickItem > contentChildren()
\qmlproperty list<Item> QtQuick.Controls::Popup::contentChildren
void setWindow(QQuickWindow *window)
bool hadActiveFocusBeforeExitTransition
void setBottomMargin(qreal value, bool reset=false)
bool contains(const QPointF &scenePos) const
QQuickPopupAnchors * anchors
void setRightMargin(qreal value, bool reset=false)
QQuickTransition * exit
QPalette defaultPalette() const override
virtual void resizeOverlay()
QMarginsF getMargins() const
QQuickPopupItem * popupItem
QQuickPopupTransitionManager transitionManager
virtual QQuickPopupPositioner * getPositioner()
virtual bool prepareExitTransition()
virtual bool prepareEnterTransition()
static QQuickPopupPrivate * get(QQuickPopup *popup)
void setLeftMargin(qreal value, bool reset=false)
virtual void finalizeEnterTransition()
virtual void hideOverlay()
void updateContentPalettes(const QPalette &parentPalette)
QQuickPopupTransitionManager(QQuickPopupPrivate *popup)
virtual void fontChange(const QFont &newFont, const QFont &oldFont)
void widthChanged()
virtual QFont defaultFont() const
virtual void keyPressEvent(QKeyEvent *event)
void dimChanged()
void scaleChanged()
QQuickTransition * enter
void backgroundChanged()
virtual void paddingChange(const QMarginsF &newPadding, const QMarginsF &oldPadding)
void bottomMarginChanged()
virtual void geometryChange(const QRectF &newGeometry, const QRectF &oldGeometry)
void xChanged()
void closePolicyChanged()
qreal availableHeight
void clipChanged()
QLocale locale
void availableHeightChanged()
void parentChanged()
qreal rightPadding
virtual void contentSizeChange(const QSizeF &newSize, const QSizeF &oldSize)
bool setAccessibleProperty(const char *propertyName, const QVariant &value)
QQuickPopup(QQuickPopupPrivate &dd, QObject *parent)
virtual bool childMouseEventFilter(QQuickItem *child, QEvent *event)
void exitChanged()
void contentItemChanged()
QQuickTransition * exit
void bottomPaddingChanged()
qreal contentHeight
virtual void mousePressEvent(QMouseEvent *event)
qreal bottomMargin
virtual void localeChange(const QLocale &newLocale, const QLocale &oldLocale)
void paddingChanged()
void contentChildrenChanged()
QQuickItem * parent
void modalChanged()
void fontChanged()
void componentComplete() override
Invoked after the root component that caused this instantiation has completed construction.
void close()
\qmlmethod void QtQuick.Controls::Popup::close()
virtual void itemChange(QQuickItem::ItemChange change, const QQuickItem::ItemChangeData &data)
virtual void spacingChange(qreal newSpacing, qreal oldSpacing)
TransformOrigin transformOrigin
virtual void insetChange(const QMarginsF &newInset, const QMarginsF &oldInset)
void topMarginChanged()
void yChanged()
virtual void focusInEvent(QFocusEvent *event)
void activeFocusChanged()
ClosePolicy closePolicy
qreal leftPadding
void leftPaddingChanged()
void localeChanged()
qreal rightMargin
void heightChanged()
void enterChanged()
virtual void mouseUngrabEvent()
void leftMarginChanged()
void rightPaddingChanged()
void zChanged()
virtual void marginsChange(const QMarginsF &newMargins, const QMarginsF &oldMargins)
virtual void mouseDoubleClickEvent(QMouseEvent *event)
void availableWidthChanged()
void classBegin() override
Invoked after class creation, but before any properties have been set.
void contentWidthChanged()
void open()
\qmlmethod void QtQuick.Controls::Popup::open()
virtual void focusOutEvent(QFocusEvent *event)
void contentHeightChanged()
virtual void mouseReleaseEvent(QMouseEvent *event)
qreal implicitWidth
QQuickItem * background
qreal contentWidth
qreal availableWidth
void focusChanged()
void maybeSetAccessibleName(const QString &name)
QString accessibleName() const
virtual bool overlayEvent(QQuickItem *item, QEvent *event)
virtual void setVisible(bool visible)
void topPaddingChanged()
void marginsChanged()
virtual void keyReleaseEvent(QKeyEvent *event)
void rightMarginChanged()
void opacityChanged()
qreal implicitHeight
virtual void mouseMoveEvent(QMouseEvent *event)
bool isComponentComplete() const
qreal bottomPadding
virtual void contentItemChange(QQuickItem *newItem, QQuickItem *oldItem)
QQuickItem * contentItem
QVariant accessibleProperty(const char *propertyName)
static QPalette palette(Scope scope)
static QFont font(Scope scope)
void transition(const QList< QQuickStateAction > &, QQuickTransition *transition, QObject *defaultTarget=nullptr)
\qmltype Window \instantiates QQuickWindow \inqmlmodule QtQuick
QQuickItem * contentItem
\qmlattachedproperty Item Window::contentItem
QQuickItem * activeFocusItem
The item which currently has active focus or null if there is no item with active focus.
\inmodule QtCore\reentrant
Definition qrect.h:483
constexpr qreal height() const noexcept
Returns the height of the rectangle.
Definition qrect.h:718
constexpr qreal width() const noexcept
Returns the width of the rectangle.
Definition qrect.h:715
\inmodule QtCore
Definition qsize.h:207
constexpr qreal width() const noexcept
Returns the width.
Definition qsize.h:321
constexpr qreal height() const noexcept
Returns the height.
Definition qsize.h:324
\macro QT_RESTRICTED_CAST_FROM_ASCII
Definition qstring.h:127
The QTouchEvent class contains parameters that describe a touch event.
Definition qevent.h:916
\inmodule QtCore
Definition qvariant.h:64
int width
the width of the window's geometry
Definition qwindow.h:82
int height
the height of the window's geometry
Definition qwindow.h:83
#define this
Definition dialogs.cpp:9
void spacingChanged()
qreal spacing
bool focus
[0]
Combined button and popup list for selecting options.
@ AllButtons
Definition qnamespace.h:89
@ ArrowCursor
@ Key_Tab
Definition qnamespace.h:659
@ Key_Backtab
Definition qnamespace.h:660
@ Key_Back
Definition qnamespace.h:841
FocusReason
@ PopupFocusReason
@ OtherFocusReason
static void * context
EGLOutputLayerEXT EGLint EGLAttrib value
[5]
bool qFuzzyCompare(qfloat16 p1, qfloat16 p2) noexcept
Definition qfloat16.h:287
#define Q_LOGGING_CATEGORY(name,...)
#define qCDebug(category,...)
constexpr const T & qMax(const T &a, const T &b)
Definition qminmax.h:42
n void setPosition(void) \n\
GLuint GLfloat GLfloat GLfloat GLfloat GLfloat z
GLint GLint GLint GLint GLint x
[0]
GLfloat GLfloat GLfloat w
[0]
GLint GLsizei GLsizei height
GLenum GLenum GLsizei const GLuint GLboolean enabled
GLint GLsizei width
GLbitfield flags
GLint GLint GLint GLint GLint GLint GLint GLbitfield GLenum filter
GLuint name
GLint y
GLfloat GLfloat GLfloat GLfloat h
struct _cl_event * event
GLfixed GLfixed GLint GLint GLfixed points
GLboolean reset
GLdouble GLdouble GLdouble GLdouble q
Definition qopenglext.h:259
GLfloat GLfloat p
[1]
GLenum GLenum GLenum GLenum GLenum scale
static qreal component(const QPointF &point, unsigned int i)
QQmlContext * qmlContext(const QObject *obj)
Definition qqml.cpp:71
Q_QML_EXPORT QQmlInfo qmlWarning(const QObject *me)
QQuickItem * qobject_cast< QQuickItem * >(QObject *o)
Definition qquickitem.h:483
static QQuickItem * createDimmer(QQmlComponent *component, QQuickPopup *popup, QQuickItem *parent)
#define QStringLiteral(str)
#define emit
#define Q_UNUSED(x)
unsigned long ulong
Definition qtypes.h:30
double qreal
Definition qtypes.h:92
QObject::connect nullptr
myObject disconnect()
[26]
QFileDialog dialog(this)
[1]
QGraphicsItem * item
QLayoutItem * child
[0]
QSizePolicy policy
IUIAutomationTreeWalker __RPC__deref_out_opt IUIAutomationElement ** parent
\inmodule QtQuick
Definition qquickitem.h:158