Qt
Internal/Contributor docs for the Qt SDK. <b>Note:</b> These are NOT official API docs; those are found <a href='https://doc.qt.io/'>here</a>.
Loading...
Searching...
No Matches
qquickmousearea.cpp
Go to the documentation of this file.
1// Copyright (C) 2016 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 "qquickmousearea_p.h"
6#include "qquickwindow.h"
7#if QT_CONFIG(quick_draganddrop)
8#include "qquickdrag_p.h"
9#endif
10
11#include <private/qqmldata_p.h>
12#include <private/qsgadaptationlayer_p.h>
13
14#include <QtGui/private/qguiapplication_p.h>
15#include <QtGui/qevent.h>
16#include <QtGui/qstylehints.h>
17
18#include <float.h>
19
21
22DEFINE_BOOL_CONFIG_OPTION(qmlMaVisualTouchDebugging, QML_VISUAL_TOUCH_DEBUGGING)
23
25
27: enabled(true), hoverEnabled(false), scrollGestureEnabled(true), hovered(false), longPress(false),
28 moved(false), stealMouse(false), doubleClick(false), preventStealing(false),
29 propagateComposedEvents(false), overThreshold(false),
30 pressAndHoldInterval(-1)
31#if QT_CONFIG(quick_draganddrop)
32 , drag(nullptr)
33#endif
34#if QT_CONFIG(cursor)
35 , cursor(nullptr)
36#endif
37{
38}
39
41{
42#if QT_CONFIG(quick_draganddrop)
43 delete drag;
44#endif
45#if QT_CONFIG(cursor)
46 delete cursor;
47#endif
48}
49
51{
52 Q_Q(QQuickMouseArea);
53 q->setAcceptedMouseButtons(Qt::LeftButton);
54 q->setAcceptTouchEvents(false); // rely on mouse events synthesized from touch
55 q->setFiltersChildMouseEvents(true);
56 if (qmlMaVisualTouchDebugging()) {
58 }
59}
60
62{
63 lastPos = event->position();
64 lastScenePos = event->scenePosition();
65 lastButton = event->button();
66 lastButtons = event->buttons();
67 lastModifiers = event->modifiers();
68 lastFlags = event->flags();
69}
70
76
82
88
89#if QT_CONFIG(wheelevent)
90bool QQuickMouseAreaPrivate::isWheelConnected()
91{
92 Q_Q(QQuickMouseArea);
94}
95#endif
96
98{
99 Q_Q(QQuickMouseArea);
101 return;
102 QPointF scenePos = q->mapToScene(QPointF(event->x(), event->y()));
103 propagateHelper(event, window->contentItem(), scenePos, t);
104}
105
107{
108 //Based off of QQuickWindow::deliverInitialMousePressEvent
109 //But specific to MouseArea, so doesn't belong in window
110 Q_Q(const QQuickMouseArea);
112
113 if (itemPrivate->flags & QQuickItem::ItemClipsChildrenToShape) {
115 if (!item->contains(p))
116 return false;
117 }
118
119 QList<QQuickItem *> children = itemPrivate->paintOrderChildItems();
120 for (int ii = children.size() - 1; ii >= 0; --ii) {
121 QQuickItem *child = children.at(ii);
122 if (!child->isVisible() || !child->isEnabled())
123 continue;
124 if (propagateHelper(ev, child, sp, sig))
125 return true;
126 }
127
128 QQuickMouseArea* ma = qobject_cast<QQuickMouseArea*>(item);
129 if (ma && ma != q && ma->isEnabled() && itemPrivate->acceptedMouseButtons() & ev->button()) {
130 switch (sig) {
131 case Click:
132 if (!ma->d_func()->isClickConnected())
133 return false;
134 break;
135 case DoubleClick:
136 if (!ma->d_func()->isDoubleClickConnected())
137 return false;
138 break;
139 case PressAndHold:
140 if (!ma->d_func()->isPressAndHoldConnected())
141 return false;
142 break;
143 }
145 if (item->contains(p)) {
146 ev->setX(p.x());
147 ev->setY(p.y());
148 ev->setAccepted(true);//It is connected, they have to explicitly ignore to let it slide
149 switch (sig) {
150 case Click: emit ma->clicked(ev); break;
151 case DoubleClick: emit ma->doubleClicked(ev); break;
152 case PressAndHold: emit ma->pressAndHold(ev); break;
153 }
154 if (ev->isAccepted())
155 return true;
156 }
157 }
158 return false;
159
160}
161
388 : QQuickItem(*(new QQuickMouseAreaPrivate), parent)
389{
390 Q_D(QQuickMouseArea);
391 d->init();
392#if QT_CONFIG(cursor)
393 // Explcitly call setCursor on QQuickItem since
394 // it internally keeps a boolean hasCursor that doesn't
395 // get set to true unless you call setCursor
397#endif
398}
399
403
424{
425 Q_D(const QQuickMouseArea);
426 return d->lastPos.x();
427}
428
430{
431 Q_D(const QQuickMouseArea);
432 return d->lastPos.y();
433}
434
446{
447 Q_D(const QQuickMouseArea);
448 return d->enabled;
449}
450
452{
453 Q_D(QQuickMouseArea);
454 if (a != d->enabled) {
455 d->enabled = a;
456 setAcceptHoverEvents(a && d->hoverEnabled);
458 }
459}
460
478{
479 Q_D(const QQuickMouseArea);
480 return d->scrollGestureEnabled;
481}
482
484{
485 Q_D(QQuickMouseArea);
486 if (e != d->scrollGestureEnabled) {
487 d->scrollGestureEnabled = e;
488 emit scrollGestureEnabledChanged();
489 }
490}
491
509{
510 Q_D(const QQuickMouseArea);
511 return d->preventStealing;
512}
513
515{
516 Q_D(QQuickMouseArea);
517 if (prevent != d->preventStealing) {
518 d->preventStealing = prevent;
519 setKeepMouseGrab(d->preventStealing && d->enabled);
521 }
522}
523
524
586{
587 Q_D(const QQuickMouseArea);
588 return d->propagateComposedEvents;
589}
590
592{
593 Q_D(QQuickMouseArea);
594 if (prevent != d->propagateComposedEvents) {
595 d->propagateComposedEvents = prevent;
596 setKeepMouseGrab(d->propagateComposedEvents && d->enabled);
598 }
599}
600
620Qt::MouseButtons QQuickMouseArea::pressedButtons() const
621{
622 Q_D(const QQuickMouseArea);
623 return d->pressed;
624}
625
627{
628 Q_D(QQuickMouseArea);
629 d->moved = false;
630 d->stealMouse = d->preventStealing;
631 d->overThreshold = false;
632 if (!d->enabled || !(event->button() & acceptedMouseButtons())) {
634 } else {
635 d->longPress = false;
636 d->saveEvent(event);
637#if QT_CONFIG(quick_draganddrop)
638 if (d->drag)
639 d->drag->setActive(false);
640#endif
641 setHovered(true);
642 d->startScene = event->scenePosition();
643 setKeepMouseGrab(d->stealMouse);
644 event->setAccepted(setPressed(event->button(), true, event->source()));
645 if (event->isAccepted())
646 d->pressAndHoldTimer.start(pressAndHoldInterval(), this);
647 }
648}
649
651{
652 Q_D(QQuickMouseArea);
653 if (!d->enabled && !d->pressed) {
655 return;
656 }
657
658 // ### we should skip this if these signals aren't used
659 // ### can GV handle this for us?
660 setHovered(contains(event->position()));
661
662 if ((event->buttons() & acceptedMouseButtons()) == 0) {
664 return;
665 }
666
667 d->saveEvent(event);
668
669
670#if QT_CONFIG(quick_draganddrop)
671 if (d->drag && d->drag->target()) {
672 if (!d->moved) {
673 d->targetStartPos = d->drag->target()->parentItem()
674 ? d->drag->target()->parentItem()->mapToScene(d->drag->target()->position())
675 : d->drag->target()->position();
676 }
677
678 QPointF startLocalPos;
679 QPointF curLocalPos;
680 if (drag()->target()->parentItem()) {
681 startLocalPos = drag()->target()->parentItem()->mapFromScene(d->startScene);
682 curLocalPos = drag()->target()->parentItem()->mapFromScene(event->scenePosition());
683 } else {
684 startLocalPos = d->startScene;
685 curLocalPos = event->scenePosition();
686 }
687
688 if (keepMouseGrab() && d->stealMouse && d->overThreshold && !d->drag->active())
689 d->drag->setActive(true);
690
691 QPointF startPos = d->drag->target()->parentItem()
692 ? d->drag->target()->parentItem()->mapFromScene(d->targetStartPos)
693 : d->targetStartPos;
694
695 bool dragX = drag()->axis() & QQuickDrag::XAxis;
696 bool dragY = drag()->axis() & QQuickDrag::YAxis;
697
698 QPointF dragPos = d->drag->target()->position();
699 QPointF boundedDragPos = dragPos;
700 if (dragX) {
701 dragPos.setX(startPos.x() + curLocalPos.x() - startLocalPos.x());
702 boundedDragPos.setX(qBound(
703 d->drag->xmin(),
704 dragPos.x(),
705 d->drag->xmax()));
706 }
707 if (dragY) {
708 dragPos.setY(startPos.y() + curLocalPos.y() - startLocalPos.y());
709 boundedDragPos.setY(qBound(
710 d->drag->ymin(),
711 dragPos.y(),
712 d->drag->ymax()));
713 }
714
715 QPointF targetPos = d->drag->target()->position();
716
717 if (d->drag->active()) {
718 d->drag->target()->setPosition(boundedDragPos);
719 d->lastPos = mapFromScene(d->lastScenePos);
720 }
721
722 bool dragOverThresholdX = QQuickDeliveryAgentPrivate::dragOverThreshold(dragPos.x() - startPos.x(),
723 Qt::XAxis, event, d->drag->threshold());
724 bool dragOverThresholdY = QQuickDeliveryAgentPrivate::dragOverThreshold(dragPos.y() - startPos.y(),
725 Qt::YAxis, event, d->drag->threshold());
726
727 if (!d->overThreshold && (((targetPos.x() != boundedDragPos.x()) && dragOverThresholdX) ||
728 ((targetPos.y() != boundedDragPos.y()) && dragOverThresholdY)))
729 {
730 d->overThreshold = true;
731 if (d->drag->smoothed())
732 d->startScene = event->scenePosition();
733 }
734
735 if (!keepMouseGrab() && d->overThreshold) {
736 setKeepMouseGrab(true);
737 d->stealMouse = true;
738 }
739
740 d->moved = true;
741 }
742#endif
743
744 QQuickMouseEvent &me = d->quickMouseEvent;
745 me.reset(d->lastPos.x(), d->lastPos.y(), d->lastButton, d->lastButtons, d->lastModifiers, false, d->longPress, event->flags());
746#if QT_DEPRECATED_SINCE(6, 6)
747 me.setSource(event->source());
748#endif
749 emit mouseXChanged(&me);
750 me.setPosition(d->lastPos);
751 emit mouseYChanged(&me);
752 me.setPosition(d->lastPos);
754}
755
757{
758 Q_D(QQuickMouseArea);
759 d->stealMouse = false;
760 d->overThreshold = false;
761 if (!d->enabled && !d->pressed) {
763 } else {
764 d->saveEvent(event);
765 setPressed(event->button(), false, event->source());
766 if (!d->pressed) {
767 // no other buttons are pressed
768#if QT_CONFIG(quick_draganddrop)
769 if (d->drag)
770 d->drag->setActive(false);
771#endif
772 // If we don't accept hover, we need to reset containsMouse.
773 if (!hoverEnabled())
774 setHovered(false);
775 QQuickWindow *w = window();
776 if (w && w->mouseGrabberItem() == this)
777 ungrabMouse();
778 if (!d->preventStealing)
779 setKeepMouseGrab(false);
780 }
781 }
782 d->doubleClick = false;
783}
784
786{
787 Q_D(QQuickMouseArea);
788 if (d->enabled) {
789 d->saveEvent(event);
790 QQuickMouseEvent &me = d->quickMouseEvent;
791 me.reset(d->lastPos.x(), d->lastPos.y(), d->lastButton, d->lastButtons, d->lastModifiers, true,
792 false, event->flags());
793#if QT_DEPRECATED_SINCE(6, 6)
794 me.setSource(event->source());
795#endif
796 me.setAccepted(d->isDoubleClickConnected());
797 emit this->doubleClicked(&me);
798 if (!me.isAccepted())
799 d->propagate(&me, QQuickMouseAreaPrivate::DoubleClick);
800 if (d->pressed)
801 d->doubleClick = d->isDoubleClickConnected() || me.isAccepted();
802
803 // Do not call the base implementation: we don't want to call event->ignore().
804 return;
805 }
807}
808
810{
811 Q_D(QQuickMouseArea);
812 if (!d->enabled && !d->pressed) {
813 // Note: The fact that MouseArea doesn't update 'containsMouse' when it's disabled, is a
814 // legacy behavior that is different from how hover events are supposed to work; Hover
815 // events are always delivered to both enabled and disabled items (when they explicitly
816 // subscribe for them), to open up for hover effects, like showing tooltips. Because of
817 // this difference, you cannot use a MouseArea to e.g trigger a tooltop on a parent that
818 // is disabled. But since MouseArea has always worked this way, it should (probably) stay
819 // that way to avoid regressions. HoverHandlers do not suffer from this limitation, and
820 // can therefore be used as a replacement to solve such cases.
822 } else {
823 d->lastPos = event->position();
824 d->lastModifiers = event->modifiers();
825 setHovered(true);
826 QQuickMouseEvent &me = d->quickMouseEvent;
827 me.reset(d->lastPos.x(), d->lastPos.y(), Qt::NoButton, Qt::NoButton, d->lastModifiers, false, false);
828 emit mouseXChanged(&me);
829 me.setPosition(d->lastPos);
830 emit mouseYChanged(&me);
831 me.setPosition(d->lastPos);
832 }
833
834 // A MouseArea should not block hover events
835 event->ignore();
836}
837
839{
840 Q_D(QQuickMouseArea);
841 if (!d->enabled && !d->pressed) {
843 } else if (d->lastPos != event->position()) {
844 d->lastPos = event->position();
845 d->lastModifiers = event->modifiers();
846 QQuickMouseEvent &me = d->quickMouseEvent;
847 me.reset(d->lastPos.x(), d->lastPos.y(), Qt::NoButton, Qt::NoButton, d->lastModifiers, false, false);
848 emit mouseXChanged(&me);
849 me.setPosition(d->lastPos);
850 emit mouseYChanged(&me);
851 me.setPosition(d->lastPos);
853 }
854
855 // A MouseArea should not block hover events
856 event->ignore();
857}
858
860{
861 Q_D(QQuickMouseArea);
862 if (!d->enabled && !d->pressed && !d->hovered)
864 else
865 setHovered(false);
866
867 // A MouseArea should not block hover events
868 event->ignore();
869}
870
871#if QT_CONFIG(wheelevent)
872void QQuickMouseArea::wheelEvent(QWheelEvent *event)
873{
874 Q_D(QQuickMouseArea);
875 if (!d->enabled || (!isScrollGestureEnabled() && event->source() != Qt::MouseEventNotSynthesized)) {
876 QQuickItem::wheelEvent(event);
877 return;
878 }
879
880 QQuickWheelEvent &we = d->quickWheelEvent;
881 we.reset(event);
882 we.setAccepted(d->isWheelConnected());
883 emit wheel(&we);
884 if (!we.isAccepted())
885 QQuickItem::wheelEvent(event);
886}
887#endif
888
889void QQuickMouseArea::ungrabMouse()
890{
891 Q_D(QQuickMouseArea);
892 if (d->pressed) {
893 // if our mouse grab has been removed (probably by Flickable), fix our
894 // state
895 d->pressed = Qt::NoButton;
896 d->stealMouse = false;
897 d->doubleClick = false;
898 d->overThreshold = false;
899 setKeepMouseGrab(false);
900
901#if QT_CONFIG(quick_draganddrop)
902 if (d->drag)
903 d->drag->setActive(false);
904#endif
905
906 emit canceled();
908 emit containsPressChanged();
910
911 if (d->hovered && !isUnderMouse()) {
912 qCDebug(lcHoverTrace) << "losing hover: not under the mouse";
913 d->hovered = false;
915 }
916 }
917}
918
920{
921 ungrabMouse();
922}
923
925{
926 // allow a Pointer Handler to steal the grab from MouseArea
927 ungrabMouse();
928}
929
931{
932 Q_D(QQuickMouseArea);
933 QPointF localPos = mapFromScene(event->scenePosition());
934
935 QQuickWindow *c = window();
936 QQuickItem *grabber = c ? c->mouseGrabberItem() : nullptr;
937 bool stealThisEvent = d->stealMouse;
938 if ((stealThisEvent || contains(localPos)) && (!grabber || !grabber->keepMouseGrab())) {
939 QMouseEvent mouseEvent(event->type(), localPos, event->scenePosition(), event->globalPosition(),
940 event->button(), event->buttons(), event->modifiers());
941 mouseEvent.setAccepted(false);
942
943 switch (event->type()) {
945 mouseMoveEvent(&mouseEvent);
946 break;
948 mousePressEvent(&mouseEvent);
949 break;
951 mouseReleaseEvent(&mouseEvent);
952 stealThisEvent = d->stealMouse;
953 break;
954 default:
955 break;
956 }
957 grabber = c ? c->mouseGrabberItem() : nullptr;
958 if (grabber && stealThisEvent && !grabber->keepMouseGrab() && grabber != this)
959 grabMouse();
960
961 return stealThisEvent;
962 }
963 if (event->type() == QEvent::MouseButtonRelease) {
964 if (d->pressed) {
965 d->pressed &= ~event->button();
967 if (!d->pressed) {
968 // no other buttons are pressed
969 d->stealMouse = false;
970 d->overThreshold = false;
971 if (c && c->mouseGrabberItem() == this)
972 ungrabMouse();
973 emit canceled();
975 emit containsPressChanged();
976 if (d->hovered) {
977 qCDebug(lcHoverTrace) << "losing hover: button released";
978 d->hovered = false;
980 }
981 }
982 }
983 }
984 return false;
985}
986
988{
989 Q_D(QQuickMouseArea);
990 if (!d->pressed &&
991 (!d->enabled || !isVisible()
992#if QT_CONFIG(quick_draganddrop)
993 || !d->drag || !d->drag->filterChildren()
994#endif
995 )
996 )
998 switch (e->type()) {
1000 case QEvent::MouseMove:
1002 return sendMouseEvent(static_cast<QMouseEvent *>(e));
1003 default:
1004 break;
1005 }
1006
1008}
1009
1011{
1012 Q_D(QQuickMouseArea);
1013 if (event->timerId() == d->pressAndHoldTimer.timerId()) {
1014 d->pressAndHoldTimer.stop();
1015#if QT_CONFIG(quick_draganddrop)
1016 bool dragged = d->drag && d->drag->active();
1017#else
1018 bool dragged = false;
1019#endif
1020 if (d->pressed && dragged == false && d->hovered == true) {
1021 d->longPress = true;
1022 QQuickMouseEvent &me = d->quickMouseEvent;
1023 me.reset(d->lastPos.x(), d->lastPos.y(), d->lastButton, d->lastButtons, d->lastModifiers, false, d->longPress, d->lastFlags);
1024#if QT_DEPRECATED_SINCE(6, 6)
1025 me.setSource(Qt::MouseEventSynthesizedByQt);
1026#endif
1027 me.setAccepted(d->isPressAndHoldConnected());
1028 emit pressAndHold(&me);
1029 if (!me.isAccepted())
1030 d->propagate(&me, QQuickMouseAreaPrivate::PressAndHold);
1031 if (!me.isAccepted()) // no one handled the long press - allow click
1032 d->longPress = false;
1033 }
1034 }
1035}
1036
1037void QQuickMouseArea::geometryChange(const QRectF &newGeometry, const QRectF &oldGeometry)
1038{
1039 Q_D(QQuickMouseArea);
1040 QQuickItem::geometryChange(newGeometry, oldGeometry);
1041
1042 if (!d->lastScenePos.isValid())
1043 d->lastScenePos = mapToScene(d->lastPos);
1044 else if (newGeometry.x() != oldGeometry.x() || newGeometry.y() != oldGeometry.y())
1045 d->lastPos = mapFromScene(d->lastScenePos);
1046}
1047
1049{
1050 Q_D(QQuickMouseArea);
1051 switch (change) {
1053 // If MouseArea becomes effectively disabled by disabling a parent
1054 // (for example, onPressed: parent.enabled = false), cancel the pressed state.
1055 if (d->pressed && !d->effectiveEnable)
1056 ungrabMouse();
1057 break;
1059 if (d->effectiveEnable && d->enabled && hoverEnabled()
1060 && d->hovered != (isVisible() && isUnderMouse())) {
1061 if (d->hovered) {
1062 // If hovered but no longer under the mouse then un-hover.
1063 setHovered(false);
1064 } else {
1065 // If under the mouse but not hovered then hover the QQuickMouseArea if it is
1066 // marked as a hovered item under the windows QQuickDeliveryAgentPrivate instance.
1067 // This is required as this QQuickMouseArea may be masked by another hoverable
1068 // QQuickMouseArea higher up in the scenes z-index ordering.
1070 QPointF scenePos{ d->window->mapFromGlobal(globalPos) };
1071
1074
1075 // If the QQuickDeliveryAgentPrivate has not already found a hovered leaf
1076 // item then attempt to find one.
1077 if (!dap->hoveredLeafItemFound) {
1078 dap->deliverHoverEvent(scenePos, scenePos, Qt::NoModifier,
1080 }
1081
1082 // Now if the QQuickDeliveryAgentPrivate has found a hovered leaf item check
1083 // that this QQuickMouseArea item was one of the hovered items.
1084 if (dap->hoveredLeafItemFound) {
1085 for (auto hoverItem : dap->hoverItems) {
1086 if (hoverItem.first == this) {
1087 // Found a match so update the hover state.
1088 d->lastScenePos = scenePos;
1089 d->lastPos = mapFromScene(d->lastScenePos);
1090 setHovered(true);
1091 break;
1092 }
1093 }
1094 }
1095 }
1096 }
1097 if (d->pressed && (!isVisible())) {
1098 // This happens when the mouse area hides itself
1099 // inside the press handler. In that case we should not keep the internal
1100 // state as pressed, since we never became the mouse grabber.
1101 ungrabMouse();
1102 }
1103 break;
1104 default:
1105 break;
1106 }
1107
1109}
1110
1123{
1124 return d_func()->hoverEnabled;
1125}
1126
1128{
1129 Q_D(QQuickMouseArea);
1130 if (h == d->hoverEnabled)
1131 return;
1132
1133 d->hoverEnabled = h;
1134 setAcceptHoverEvents(h && d->enabled);
1135
1137}
1138
1139
1150{
1151 Q_D(const QQuickMouseArea);
1152 return d->hovered;
1153}
1154
1160{
1161 Q_D(const QQuickMouseArea);
1162 return d->pressed;
1163}
1164
1178{
1179 Q_D(const QQuickMouseArea);
1180 return d->pressed && d->hovered;
1181}
1182
1184{
1185 Q_D(QQuickMouseArea);
1186 if (d->hovered != h) {
1187 qCDebug(lcHoverTrace) << this << d->hovered << "->" << h;
1188 d->hovered = h;
1190 d->hovered ? emit entered() : emit exited();
1191 if (d->pressed)
1192 emit containsPressChanged();
1193 }
1194}
1195
1216Qt::MouseButtons QQuickMouseArea::acceptedButtons() const
1217{
1218 return acceptedMouseButtons();
1219}
1220
1221void QQuickMouseArea::setAcceptedButtons(Qt::MouseButtons buttons)
1222{
1223 if (buttons != acceptedMouseButtons()) {
1224 setAcceptedMouseButtons(buttons);
1226 }
1227}
1228
1230{
1231 Q_D(QQuickMouseArea);
1232
1233#if QT_CONFIG(quick_draganddrop)
1234 bool dragged = d->drag && d->drag->active();
1235#else
1236 bool dragged = false;
1237#endif
1238 bool wasPressed = d->pressed & button;
1239 bool isclick = wasPressed && p == false && dragged == false && d->hovered == true;
1240 Qt::MouseButtons oldPressed = d->pressed;
1241
1242 if (wasPressed != p) {
1243 QQuickMouseEvent &me = d->quickMouseEvent;
1244 me.reset(d->lastPos.x(), d->lastPos.y(), d->lastButton, d->lastButtons, d->lastModifiers, isclick, d->longPress, d->lastFlags);
1245#if QT_DEPRECATED_SINCE(6, 6)
1246 me.setSource(source);
1247#endif
1248 if (p) {
1249 d->pressed |= button;
1250 if (!d->doubleClick)
1251 emit pressed(&me);
1252 me.setPosition(d->lastPos);
1253 emit mouseXChanged(&me);
1254 me.setPosition(d->lastPos);
1255 emit mouseYChanged(&me);
1256
1257 if (!me.isAccepted()) {
1258 d->pressed = Qt::NoButton;
1259 if (!hoverEnabled())
1260 setHovered(false);
1261 }
1262
1263 if (!oldPressed) {
1265 emit containsPressChanged();
1266 }
1268 } else {
1269 d->pressed &= ~button;
1270 emit released(&me);
1271 me.setPosition(d->lastPos);
1272 if (!d->pressed) {
1274 emit containsPressChanged();
1275 }
1277 if (isclick && !d->longPress && !d->doubleClick){
1278 me.setAccepted(d->isClickConnected());
1279 emit clicked(&me);
1280 if (!me.isAccepted())
1281 d->propagate(&me, QQuickMouseAreaPrivate::Click);
1282 }
1283 }
1284
1285 return me.isAccepted();
1286 }
1288 return false;
1289}
1290
1291
1335#if QT_CONFIG(cursor)
1336Qt::CursorShape QQuickMouseArea::cursorShape() const
1337{
1338 return cursor().shape();
1339}
1340
1341void QQuickMouseArea::setCursorShape(Qt::CursorShape shape)
1342{
1343 if (cursor().shape() == shape)
1344 return;
1345
1346 setCursor(shape);
1347
1348 emit cursorShapeChanged();
1349}
1350
1351#endif
1352
1353
1371{
1372 Q_D(const QQuickMouseArea);
1373 return d->pressAndHoldInterval > -1 ?
1374 d->pressAndHoldInterval : QGuiApplication::styleHints()->mousePressAndHoldInterval();
1375}
1376
1378{
1379 Q_D(QQuickMouseArea);
1380 if (interval != d->pressAndHoldInterval) {
1381 d->pressAndHoldInterval = interval;
1382 emit pressAndHoldIntervalChanged();
1383 }
1384}
1385
1387{
1388 Q_D(QQuickMouseArea);
1389 if (d->pressAndHoldInterval > -1) {
1390 d->pressAndHoldInterval = -1;
1391 emit pressAndHoldIntervalChanged();
1392 }
1393}
1394
1444#if QT_CONFIG(quick_draganddrop)
1445QQuickDrag *QQuickMouseArea::drag()
1446{
1447 Q_D(QQuickMouseArea);
1448 if (!d->drag)
1449 d->drag = new QQuickDrag;
1450 return d->drag;
1451}
1452#endif
1453
1455{
1456 Q_UNUSED(data);
1457 Q_D(QQuickMouseArea);
1458
1459 if (!qmlMaVisualTouchDebugging())
1460 return nullptr;
1461
1462 QSGInternalRectangleNode *rectangle = static_cast<QSGInternalRectangleNode *>(oldNode);
1463 if (!rectangle) rectangle = d->sceneGraphContext()->createInternalRectangleNode();
1464
1465 rectangle->setRect(QRectF(0, 0, width(), height()));
1466 rectangle->setColor(QColor(255, 0, 0, 50));
1467 rectangle->update();
1468 return rectangle;
1469}
1470
1472
1473#include "moc_qquickmousearea_p.cpp"
The QColor class provides colors based on RGB, HSV or CMYK values.
Definition qcolor.h:31
Qt::CursorShape shape() const
Returns the cursor shape identifier.
Definition qcursor.cpp:498
static qint64 currentSecsSinceEpoch() noexcept
\inmodule QtCore
Definition qcoreevent.h:45
@ MouseMove
Definition qcoreevent.h:63
@ MouseButtonPress
Definition qcoreevent.h:60
@ MouseButtonRelease
Definition qcoreevent.h:61
Type type() const
Returns the event type.
Definition qcoreevent.h:304
virtual bool contains(const QPointF &point) const
Returns true if this item contains point, which is in local coordinates; otherwise,...
QPointF mapFromScene(const QPointF &point) const
Maps the point point, which is in this item's scene's coordinate system, to this item's coordinate sy...
static struct QGuiApplicationPrivate::QLastCursorPosition lastCursorPosition
static QStyleHints * styleHints()
Returns the application's style hints.
\inmodule QtGui
Definition qevent.h:246
\inmodule QtGui
Definition qevent.h:196
\inmodule QtCore\reentrant
Definition qpoint.h:217
constexpr qreal x() const noexcept
Returns the x coordinate of this point.
Definition qpoint.h:343
constexpr qreal y() const noexcept
Returns the y coordinate of this point.
Definition qpoint.h:348
constexpr void setX(qreal x) noexcept
Sets the x coordinate of this point to the given finite x coordinate.
Definition qpoint.h:353
virtual void setAccepted(bool accepted) override
\reimp
Definition qevent.cpp:318
static bool dragOverThreshold(qreal d, Qt::Axis axis, QMouseEvent *event, int startDragThreshold=-1)
bool deliverHoverEvent(const QPointF &scenePos, const QPointF &lastScenePos, Qt::KeyboardModifiers modifiers, ulong timestamp)
QList< QQuickItem * > paintOrderChildItems() const
QQuickWindow * window
Qt::MouseButtons acceptedMouseButtons() const
QQmlListProperty< QQuickItem > children()
static QQuickItemPrivate * get(QQuickItem *item)
The QQuickItem class provides the most basic of all visual items in \l {Qt Quick}.
Definition qquickitem.h:63
QPointF mapToScene(const QPointF &point) const
Maps the given point in this item's coordinate system to the equivalent point within the scene's coor...
virtual void mouseReleaseEvent(QMouseEvent *event)
This event handler can be reimplemented in a subclass to receive mouse release events for an item.
virtual void hoverEnterEvent(QHoverEvent *event)
This event handler can be reimplemented in a subclass to receive hover-enter events for an item.
virtual void mouseDoubleClickEvent(QMouseEvent *event)
This event handler can be reimplemented in a subclass to receive mouse double-click events for an ite...
Qt::MouseButtons acceptedMouseButtons() const
Returns the mouse buttons accepted by this item.
virtual void geometryChange(const QRectF &newGeometry, const QRectF &oldGeometry)
void setAcceptHoverEvents(bool enabled)
If enabled is true, this sets the item to accept hover events; otherwise, hover events are not accept...
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...
virtual void hoverMoveEvent(QHoverEvent *event)
This event handler can be reimplemented in a subclass to receive hover-move events for an item.
bool isVisible() const
virtual Q_INVOKABLE bool contains(const QPointF &point) const
\qmlmethod bool QtQuick::Item::contains(point point)
void setAcceptedMouseButtons(Qt::MouseButtons buttons)
Sets the mouse buttons accepted by this item to buttons.
QQuickWindow * window() const
Returns the window in which this item is rendered.
virtual void mousePressEvent(QMouseEvent *event)
This event handler can be reimplemented in a subclass to receive mouse press events for an item.
qreal width
This property holds the width of this item.
Definition qquickitem.h:75
QQuickItem * parentItem() const
virtual void itemChange(ItemChange, const ItemChangeData &)
Called when change occurs for this item.
bool keepMouseGrab() const
Returns whether mouse input should exclusively remain with this item.
void setKeepMouseGrab(bool)
Sets whether the mouse input should remain exclusively with this item.
void grabMouse()
qreal height
This property holds the height of this item.
Definition qquickitem.h:76
virtual bool childMouseEventFilter(QQuickItem *, QEvent *)
Reimplement this method to filter the pointer events that are received by this item's children.
ItemChange
Used in conjunction with QQuickItem::itemChange() to notify the item about certain types of changes.
Definition qquickitem.h:144
@ ItemVisibleHasChanged
Definition qquickitem.h:148
@ ItemEnabledHasChanged
Definition qquickitem.h:155
bool isUnderMouse() const
@ ItemClipsChildrenToShape
Definition qquickitem.h:130
virtual void hoverLeaveEvent(QHoverEvent *event)
This event handler can be reimplemented in a subclass to receive hover-leave events for an item.
virtual void mouseMoveEvent(QMouseEvent *event)
This event handler can be reimplemented in a subclass to receive mouse move events for an item.
void saveEvent(QMouseEvent *event)
bool propagateHelper(QQuickMouseEvent *, QQuickItem *, const QPointF &, PropagateType)
void propagate(QQuickMouseEvent *event, PropagateType)
Qt::KeyboardModifiers lastModifiers
Qt::MouseEventFlags lastFlags
QQmlNullableValue< QPointF > lastScenePos
bool isEnabled() const
\qmlproperty bool QtQuick::MouseArea::enabled This property holds whether the item accepts mouse even...
void setAcceptedButtons(Qt::MouseButtons buttons)
bool setPressed(Qt::MouseButton button, bool p, Qt::MouseEventSource source)
void hoverMoveEvent(QHoverEvent *event) override
This event handler can be reimplemented in a subclass to receive hover-move events for an item.
void released(QQuickMouseEvent *mouse)
void mousePressEvent(QMouseEvent *event) override
This event handler can be reimplemented in a subclass to receive mouse press events for an item.
bool childMouseEventFilter(QQuickItem *i, QEvent *e) override
Reimplement this method to filter the pointer events that are received by this item's children.
void itemChange(ItemChange change, const ItemChangeData &value) override
Called when change occurs for this item.
void mouseXChanged(QQuickMouseEvent *mouse)
void mouseUngrabEvent() override
This event handler can be reimplemented in a subclass to be notified when a mouse ungrab event has oc...
void pressedButtonsChanged()
void mouseReleaseEvent(QMouseEvent *event) override
This event handler can be reimplemented in a subclass to receive mouse release events for an item.
bool isScrollGestureEnabled() const
\qmlproperty bool QtQuick::MouseArea::scrollGestureEnabled
void hoverEnabledChanged()
bool sendMouseEvent(QMouseEvent *event)
void clicked(QQuickMouseEvent *mouse)
void geometryChange(const QRectF &newGeometry, const QRectF &oldGeometry) override
void setPreventStealing(bool prevent)
void hoverLeaveEvent(QHoverEvent *event) override
This event handler can be reimplemented in a subclass to receive hover-leave events for an item.
void hoveredChanged()
void touchUngrabEvent() override
This event handler can be reimplemented in a subclass to be notified when a touch ungrab event has oc...
void positionChanged(QQuickMouseEvent *mouse)
void enabledChanged()
void doubleClicked(QQuickMouseEvent *mouse)
void propagateComposedEventsChanged()
void setPropagateComposedEvents(bool propagate)
Qt::MouseButtons acceptedButtons
void mouseDoubleClickEvent(QMouseEvent *event) override
This event handler can be reimplemented in a subclass to receive mouse double-click events for an ite...
void preventStealingChanged()
void pressAndHold(QQuickMouseEvent *mouse)
void acceptedButtonsChanged()
Qt::MouseButtons pressedButtons
void setPressAndHoldInterval(int interval)
void mouseYChanged(QQuickMouseEvent *mouse)
void pressedChanged()
bool hovered() const
\qmlproperty bool QtQuick::MouseArea::containsMouse This property holds whether the mouse is currentl...
void hoverEnterEvent(QHoverEvent *event) override
This event handler can be reimplemented in a subclass to receive hover-enter events for an item.
QSGNode * updatePaintNode(QSGNode *, UpdatePaintNodeData *) override
\qmlpropertygroup QtQuick::MouseArea::drag \qmlproperty Item QtQuick::MouseArea::drag....
bool isPressed() const
\qmlproperty bool QtQuick::MouseArea::pressed This property holds whether any of the \l acceptedButto...
void setScrollGestureEnabled(bool)
void mouseMoveEvent(QMouseEvent *event) override
This event handler can be reimplemented in a subclass to receive mouse move events for an item.
void timerEvent(QTimerEvent *event) override
This event handler can be reimplemented in a subclass to receive timer events for the object.
QQuickMouseArea(QQuickItem *parent=nullptr)
\qmltype MouseArea \instantiates QQuickMouseArea \inqmlmodule QtQuick
void setHoverEnabled(bool h)
\qmlproperty int QtQuick::KeyEvent::key
void setAccepted(bool accepted)
void reset(qreal x, qreal y, Qt::MouseButton button, Qt::MouseButtons buttons, Qt::KeyboardModifiers modifiers, bool isClick=false, bool wasHeld=false, Qt::MouseEventFlags flags={ })
void setPosition(const QPointF &point)
\qmlproperty real QtQuick::MouseEvent::x \qmlproperty real QtQuick::MouseEvent::y
static QQuickWindowPrivate * get(QQuickWindow *c)
QQuickDeliveryAgentPrivate * deliveryAgentPrivate() const
\qmltype Window \instantiates QQuickWindow \inqmlmodule QtQuick
QQuickItem * contentItem
\qmlattachedproperty Item Window::contentItem
\inmodule QtCore\reentrant
Definition qrect.h:484
constexpr qreal y() const noexcept
Returns the y-coordinate of the rectangle's top edge.
Definition qrect.h:672
constexpr qreal x() const noexcept
Returns the x-coordinate of the rectangle's left edge.
Definition qrect.h:669
virtual void setRect(const QRectF &rect)=0
virtual void update()=0
virtual void setColor(const QColor &color)=0
\group qtquick-scenegraph-nodes \title Qt Quick Scene Graph Node classes
Definition qsgnode.h:37
\inmodule QtCore
Definition qcoreevent.h:366
QPushButton * button
[2]
QCursor cursor
Combined button and popup list for selecting options.
MouseButton
Definition qnamespace.h:56
@ LeftButton
Definition qnamespace.h:58
@ NoButton
Definition qnamespace.h:57
MouseEventSource
@ MouseEventSynthesizedByQt
@ MouseEventNotSynthesized
CursorShape
@ ArrowCursor
@ NoModifier
@ XAxis
@ YAxis
EGLOutputLayerEXT EGLint EGLAttrib value
[5]
#define qCDebug(category,...)
#define Q_DECLARE_LOGGING_CATEGORY(name)
constexpr const T & qBound(const T &min, const T &val, const T &max)
Definition qminmax.h:44
GLfloat GLfloat GLfloat w
[0]
GLboolean GLboolean GLboolean GLboolean a
[7]
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
GLenum GLenum GLsizei const GLuint GLboolean enabled
GLenum target
GLfloat GLfloat GLfloat GLfloat h
GLsizei GLsizei GLchar * source
struct _cl_event * event
const GLubyte * c
GLdouble GLdouble t
Definition qopenglext.h:243
GLdouble GLdouble GLdouble GLdouble q
Definition qopenglext.h:259
GLfloat GLfloat p
[1]
#define DEFINE_BOOL_CONFIG_OPTION(name, var)
#define IS_SIGNAL_CONNECTED(Sender, SenderType, Name, Arguments)
#define sp
#define QT_CONFIG(feature)
#define emit
#define Q_UNUSED(x)
double qreal
Definition qtypes.h:187
item setCursor(Qt::IBeamCursor)
[1]
QGraphicsItem * item
QLayoutItem * child
[0]
\inmodule QtQuick
Definition qquickitem.h:159