4#include <QtCore/qdebug.h>
5#include <QtGui/private/qevent_p.h>
6#include <QtGui/private/qeventpoint_p.h>
7#include <QtGui/private/qguiapplication_p.h>
8#include <QtGui/qpa/qplatformtheme.h>
9#include <QtQml/private/qabstractanimationjob_p.h>
10#include <QtQuick/private/qquickdeliveryagent_p_p.h>
11#include <QtQuick/private/qquickhoverhandler_p.h>
12#include <QtQuick/private/qquickpointerhandler_p_p.h>
13#if QT_CONFIG(quick_draganddrop)
14#include <QtQuick/private/qquickdrag_p.h>
16#include <QtQuick/private/qquickitem_p.h>
17#include <QtQuick/private/qquickprofiler_p.h>
18#include <QtQuick/private/qquickrendercontrol_p.h>
19#include <QtQuick/private/qquickwindow_p.h>
46 static int allowRightClick = -1;
47 if (allowRightClick < 0) {
53 return allowRightClick != 0;
63 ret.setAccepted(
true);
64 ret.setTimestamp(touchEvent->timestamp());
70 qWarning() <<
"Unexpected: synthesized an indistinguishable mouse event" << mouseEvent;
75 bool doubleClicked =
false;
80 doubleClicked = (
qAbs(distanceBetweenPresses.
x()) <= doubleTapDistance) && (
qAbs(distanceBetweenPresses.
y()) <= doubleTapDistance);
85 mouseDoubleClickInterval());
86 doubleClicked = timeBetweenPresses < doubleClickInterval;
142 qCDebug(lcTouchTarget) <<
q <<
"skipping delivery of synth-mouse event from" <<
device;
149 if (!
event.points().size())
155 for (
auto &
p :
event.points()) {
170 event.setAccepted(mousePress.isAccepted());
171 if (mousePress.isAccepted()) {
174 const auto &pt = mousePress.point(0);
175 if (!mousePress.exclusiveGrabber(pt))
176 mousePress.setExclusiveGrabber(pt,
item);
184 event.setAccepted(mouseDoubleClick.
isAccepted());
199 if (moveDelta.
x() >= doubleTapDistance || moveDelta.
y() >= doubleTapDistance)
209 return event.isAccepted();
268 devPriv->removeGrabber(grabber,
cancel);
275 if (epd && epd->exclusiveGrabber == grabber && epd->exclusiveGrabberContext.data() ==
q) {
277 qCDebug(lcMouseTarget) <<
"removeGrabber" << oldGrabber <<
"-> null";
284 for (
auto device : touchDevices) {
303 for (
qsizetype i = 0;
i != touchEvent->pointCount(); ++
i) {
304 auto &pt = touchEvent->
point(
i);
305 QMutableEventPoint::setScenePosition(pt, pt.position());
321 for (
int i = 0;
i < windowList.
count();
i++) {
345 qCDebug(lcFocus) <<
q <<
"focus" <<
item <<
"in scope" << scope;
355 bool sendFocusIn =
false;
365 newActiveFocusItem =
item;
372 newActiveFocusItem = scope;
375 if (oldActiveFocusItem) {
383 while (afi && afi != scope) {
395 if (oldSubFocusItem) {
399 changed << oldSubFocusItem;
413 itemPrivate->
focus =
true;
423 changed << newActiveFocusItem;
426 while (afi && afi != scope) {
439 if (oldActiveFocusItem) {
457 qCDebug(lcFocus) <<
" delegating setFocusInScope to" << da;
471 qCDebug(lcFocus) <<
q <<
"clear focus" <<
item <<
"in scope" << scope;
493 newActiveFocusItem = scope;
501 if (oldActiveFocusItem) {
503 while (afi && afi != scope) {
519 changed << oldSubFocusItem;
531 if (newActiveFocusItem) {
532 Q_ASSERT(newActiveFocusItem == scope);
539 if (oldActiveFocusItem) {
557 qCDebug(lcFocus) <<
" delegating clearFocusInScope to" << da;
613 auto item = hoverItem.first;
686 return d->sceneTransform;
700 if (
d->sceneTransform)
701 delete d->sceneTransform;
715 d->currentEventDeliveryAgent =
this;
716 auto cleanup =
qScopeGuard([
d] {
d->currentEventDeliveryAgent =
nullptr; });
718 switch (ev->
type()) {
724 d->handleMouseEvent(me);
746 d->handleTouchEvent(touch);
756 return d->deliverTouchCancelEvent(
static_cast<QTouchEvent*
>(ev));
763 bool accepted =
d->deliverHoverEvent(scenePos,
766 d->lastMousePosition = scenePos;
779#if QT_CONFIG(quick_draganddrop)
784 d->deliverDragEvent(
d->dragGrabber, ev);
789 if (
d->activeFocusItem)
790 qGuiApp->inputMethod()->commit();
793#if QT_CONFIG(gestures)
795 d->deliverSinglePointEventUntilAccepted(
static_cast<QPointerEvent *
>(ev));
799 d->deliverKeyEvent(
static_cast<QKeyEvent *
>(ev));
811 while (
target->isFocusScope() &&
target->scopedFocusItem() &&
target->scopedFocusItem()->isEnabled())
818#if QT_CONFIG(wheelevent)
820 auto event =
static_cast<QWheelEvent *
>(ev);
829 event->angleDelta().x(),
event->angleDelta().y());
830 d->deliverSinglePointEventUntilAccepted(
event);
831 d->lastWheelEventAccepted =
event->isAccepted();
835#if QT_CONFIG(tabletevent)
840 auto *tabletEvent =
static_cast<QTabletEvent *
>(ev);
841 d->deliverPointerEvent(tabletEvent);
857 if (activeFocusItem) {
873 if (keyPress &&
e->spontaneous() ==
false)
875 e->key(),
e->modifiers(),
e->text(),
876 e->isAutoRepeat(),
e->count());
891#if QT_CONFIG(quick_draganddrop)
900#if QT_CONFIG(quick_draganddrop)
902 dragGrabber =
nullptr;
920 if (transformedLocalPos)
921 QMutableEventPoint::setPosition(point, *transformedLocalPos);
933 for (
QObject *grabberObject : passiveGrabbers) {
939 if (handler && !eventDeliveryTargets.
contains(handler)) {
940 bool alreadyFiltered =
false;
944 auto it = std::find_if(sendFilteredPointerEventResult.
begin(), sendFilteredPointerEventResult.
end(),
946 if (
it != sendFilteredPointerEventResult.
end()) {
949 alreadyFiltered =
it->second;
952 sendFilteredPointerEventResult <<
qMakePair(par, alreadyFiltered);
954 if (!alreadyFiltered) {
957 handler->handlePointerEvent(pointerEvent);
963 if ((
isMouseEvent(pointerEvent) && excGrabber->keepMouseGrab())
964 || (
isTouchEvent(pointerEvent) && excGrabber->keepTouchGrab())) {
980 const auto transform = itemPrivate->windowToItemTransform();
981 const auto transformToGlobal = itemPrivate->windowToGlobalTransform();
982 auto globalPos = transformToGlobal.map(scenePos);
987 QMutableEventPoint::setPosition(point,
transform.map(scenePos));
988 QMutableEventPoint::setGlobalLastPosition(point, transformToGlobal.map(lastScenePos));
1028 if (!subtreeHoverEnabled && !itemsWasHovered)
1033 if (subtreeHoverEnabled) {
1041 auto hoverId = (*it).second;
1049 if (
item && hoverId != 0) {
1058 return itemsWasHovered || itemsAreHovered;
1114 const QPointF localPos =
child->mapFromScene(scenePos);
1115 if (!
child->contains(localPos))
1149 Qt::KeyboardModifiers
modifiers,
ulong timestamp,
bool clearHover)
1153 const QPointF globalPos =
item->mapToGlobal(localPos);
1157 qCDebug(lcHoverTrace) <<
"item:" <<
item <<
"scene pos:" << scenePos <<
"localPos:" << localPos
1158 <<
"wasHovering:" << wasHovering <<
"isHovering:" << isHovering;
1160 bool accepted =
false;
1176 }
else if (wasHovering) {
1199 if (!hh->isHovered())
1214 hh->handlePointerEvent(&hoverEvent);
1215 if (hh->isHovered()) {
1220 if (hh->isBlocking()) {
1221 qCDebug(lcHoverTrace) <<
"skipping rest of hover delivery due to blocking" << hh;
1246 for (
const auto &passiveGrabber :
event->passiveGrabbers(point)) {
1248 if (targetItems.
contains(grabberItem))
1267 if (
event->isAccepted()) {
1284 sendTouchCancelEvent(
event);
1297 qCDebug(lcTouchCmprs) <<
"delivering" <<
e.get();
1315 qCDebug(lcFocus) <<
"deactivated" <<
win->title();
1317 for (
auto device : inputDevices) {
1318 if (
auto pointingDevice = qobject_cast<const QPointingDevice *>(
device)) {
1320 for (
auto epd : devPriv->activePoints.values()) {
1321 if (!epd.exclusiveGrabber.isNull()) {
1322 bool relevant =
false;
1325 else if (
QQuickPointerHandler *handler = qmlobject_cast<QQuickPointerHandler *>(epd.exclusiveGrabber.data())) {
1326 if (handler->parentItem())
1327 relevant = (handler->parentItem()->window() ==
win && epd.exclusiveGrabberContext.data() ==
q);
1334 devPriv->setExclusiveGrabber(
nullptr, epd.eventPoint,
nullptr);
1345 qCDebug(lcFocus) <<
"hidden" <<
win->title();
1352 for (
auto &point : ev->
points()) {
1368 auto &point = ev->
point(
i);
1369 QMutableEventPoint::setPosition(point, dest->
mapFromScene(point.scenePosition()));
1370 qCDebug(lcPtrLoc) << ev->
type() <<
"@" << point.scenePosition() <<
"to"
1380 if (!
result.contains(grabber))
1398 for (
const auto &point : ev->
points()) {
1407 switch (ev->
type()) {
1425 switch (ev->
type()) {
1437 switch (ev->
type()) {
1450 switch (ev->
type()) {
1519 QEventPoint::States
states =
event->touchPointStates();
1547 bool mismatch =
false;
1549 auto tpts =
event->points();
1551 const auto &tp = tpts.at(
i);
1553 if (tp.id() != tpDelayed.id()) {
1597 if (
event->pointCount()) {
1598 auto &point =
event->point(0);
1640 switch (
event->type()) {
1650#if QT_CONFIG(cursor)
1661 event->position().x(),
event->position().y());
1666 if (!
event->points().size() || !
event->exclusiveGrabber(
event->point(0))) {
1668 event->setAccepted(accepted);
1671#if QT_CONFIG(cursor)
1714#if !defined(Q_OS_WEBOS)
1725 qCDebug(lcHoverTrace) <<
q <<
"frame-sync hover delivery done";
1732 qCWarning(lcPtr,
"detected interleaved frame-sync and actual events");
1754 if (
auto *handler = qmlobject_cast<QQuickPointerHandler *>(grabber)) {
1755 if (handler->parentItem()) {
1757 deliveryAgent = itemPriv->deliveryAgent();
1758 if (deliveryAgent ==
q) {
1765 if (
isSubsceneAgent && (!itemPriv->extra.isAllocated() || !itemPriv->extra->subsceneDeliveryAgent))
1766 itemPriv->maybeHasSubsceneDeliveryAgent =
true;
1773 switch (transition) {
1787 bool allReleasedOrCancelled =
true;
1789 for (
const auto &pt :
event->points()) {
1791 allReleasedOrCancelled =
false;
1796 if (allReleasedOrCancelled)
1797 grabberItem->touchUngrabEvent();
1804 deliveryAgent = itemPriv->deliveryAgent();
1807 if (
isSubsceneAgent && grabGained && (!itemPriv->extra.isAllocated() || !itemPriv->extra->subsceneDeliveryAgent))
1808 itemPriv->maybeHasSubsceneDeliveryAgent =
true;
1812 switch (transition) {
1817 qCDebug(lcPtr) <<
"remembering that" <<
q <<
"handles point" << point.
id() <<
"after" << transition;
1822 epd->exclusiveGrabberContext =
q;
1823 qCDebug(lcPtr) <<
"remembering that" <<
q <<
"handles point" << point.
id() <<
"after" << transition;
1884 originalScenePositions.
resize(
event->pointCount());
1885 for (
int i = 0;
i <
event->pointCount(); ++
i) {
1886 auto &pt =
event->point(
i);
1887 originalScenePositions[
i] = pt.scenePosition();
1888 QMutableEventPoint::setScenePosition(pt,
sceneTransform->
map(pt.scenePosition()));
1889 qCDebug(lcPtrLoc) <<
q <<
event->type() << pt.id() <<
"transformed scene pos" << pt.scenePosition();
1892 qCDebug(lcPtrLoc) <<
q <<
event->type() <<
"no scene transform set";
1901 for (
int i = 0;
i <
event->pointCount(); ++
i)
1902 event->point(
i).setAccepted(
false);
1904 if (
event->isBeginEvent()) {
1907 event->setAccepted(
false);
1911 if (
event->isEndEvent())
1928 for (
int i = 0;
i <
event->pointCount(); ++
i)
1929 QMutableEventPoint::setScenePosition(
event->point(
i), originalScenePositions.
at(
i));
1960 bool checkMouseButtons,
bool checkAcceptsTouch)
const
1967 qCDebug(lcPtrLoc) <<
q <<
"point" << point.
id() << point.
scenePosition() <<
"->" << itemPos <<
": relevant?" << relevant <<
"to" <<
item << point;
1974 if (itemPrivate->hasPointerHandlers()) {
1976 if (itemPrivate->anyPointerHandlerWants(
event, point))
1988 [](
auto lhs,
auto rhs) ->
bool { return lhs->z() < rhs; });
1995 if (!
child->isVisible() || !
child->isEnabled() || childPrivate->culled ||
1996 (
child !=
item && childPrivate->extra.isAllocated() && childPrivate->extra->subsceneDeliveryAgent))
2018 int insertPosition = targets.
size();
2021 if (newInsertPosition >= 0) {
2022 Q_ASSERT(newInsertPosition <= insertPosition);
2023 insertPosition = newInsertPosition;
2026 if (insertPosition == targets.
size() ||
list2.
at(
i) != targets.
at(insertPosition))
2041 for (
auto grabber : grabbers) {
2068 for (
auto &point :
event->points()) {
2071 qWarning() <<
"point is not in activePoints" << point;
2075 for (
int i = 0;
i < epd->passiveGrabbersContext.size(); ++
i) {
2076 if (epd->passiveGrabbersContext.at(
i).data() ==
q)
2077 relevantPassiveGrabbers << epd->passiveGrabbers.
at(
i);
2079 if (!relevantPassiveGrabbers.
isEmpty())
2089 for (
auto &point :
event->points()) {
2095 if (targetItems.
size()) {
2098 targetItems = targetItemsForPoint;
2102 if (grabbers.contains(
item))
2167 if (qobject_cast<QQuickPointerHandler *>(
event->exclusiveGrabber(point->eventPoint)))
2173 for (
int i = 0;
i <
event->pointCount(); ++
i) {
2174 auto &point =
event->point(
i);
2176 if (targetItems.
size()) {
2179 targetItems = targetItemsForPoint;
2190 if (
event->isAccepted())
2202 for (
int i = 0;
i <
event->pointCount(); ++
i)
2203 event->point(
i).setAccepted(
false);
2206 if (
event->allPointsAccepted())
2207 handlersOnly =
true;
2210 return event->allPointsAccepted();
2224#if defined(Q_OS_ANDROID) && QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
2267 auto &point = pointerEvent->
point(0);
2269 if (mouseGrabber && mouseGrabber !=
item && mouseGrabber != oldMouseGrabber) {
2276 item->mouseUngrabEvent();
2282 point.setAccepted(
true);
2291 bool eventAccepted =
false;
2298 qCDebug(lcTouch) <<
"considering delivering" << &touchEvent <<
" to " <<
item;
2301 qCDebug(lcTouch) <<
"actually delivering" << &touchEvent <<
" to " <<
item;
2303 eventAccepted = touchEvent.isAccepted();
2313 if (eventAccepted) {
2315 for (
int i = 0;
i < touchEvent.pointCount(); ++
i) {
2316 auto &point = touchEvent.
point(
i);
2326 for (
const auto &point: touchEvent.
points()) {
2329 qCDebug(lcTouchTarget) <<
"TP" <<
Qt::hex << point.id() <<
"disassociated";
2337#if QT_CONFIG(quick_draganddrop)
2343 if (grabItem != grabber->
end()) {
2346 QDropEvent *
e =
static_cast<QDropEvent *
>(
event);
2347 for (
e->setAccepted(
false); !
e->isAccepted() && grabItem != grabber->
end(); grabItem = grabber->
release(grabItem)) {
2348 QPointF p = (**grabItem)->mapFromScene(
e->position().toPoint());
2349 QDropEvent translatedEvent(
2351 e->possibleActions(),
2357 e->setAccepted(translatedEvent.isAccepted());
2358 e->setDropAction(translatedEvent.dropAction());
2363 QDragLeaveEvent leaveEvent;
2364 for (; grabItem != grabber->
end(); grabItem = grabber->
release(grabItem))
2369 QDragMoveEvent *moveEvent =
static_cast<QDragMoveEvent *
>(
event);
2374 for (; grabItem != grabber->
end(); grabItem = grabber->
release(grabItem))
2375 currentGrabItems.
append(**grabItem);
2378 QDragEnterEvent enterEvent(
2379 moveEvent->position().toPoint(),
2380 moveEvent->possibleActions(),
2381 moveEvent->mimeData(),
2382 moveEvent->buttons(),
2383 moveEvent->modifiers());
2385 event->setAccepted(deliverDragEvent(grabber,
rootItem, &enterEvent, ¤tGrabItems,
2388 for (grabItem = grabber->
begin(); grabItem != grabber->
end(); ++grabItem) {
2389 int i = currentGrabItems.
indexOf(**grabItem);
2393 QDragMoveEvent translatedEvent(
2394 (**grabItem)->mapFromScene(moveEvent->position().toPoint()).toPoint(),
2395 moveEvent->possibleActions(),
2396 moveEvent->mimeData(),
2397 moveEvent->buttons(),
2398 moveEvent->modifiers());
2401 event->setAccepted(translatedEvent.isAccepted());
2407 QDragLeaveEvent leaveEvent;
2415 QDragMoveEvent *
e =
static_cast<QDragMoveEvent *
>(
event);
2416 QDragEnterEvent enterEvent(
2417 e->position().toPoint(),
2418 e->possibleActions(),
2423 event->setAccepted(deliverDragEvent(grabber,
rootItem, &enterEvent));
2429bool QQuickDeliveryAgentPrivate::deliverDragEvent(
2440 if (!itemContained) {
2448 QDragEnterEvent enterEvent(
2449 event->position().toPoint(),
2450 event->possibleActions(),
2453 event->modifiers());
2461 if (deliverDragEvent(grabber,
children.
at(ii), &enterEvent, currentGrabItems, formerTarget))
2465 if (itemContained) {
2468 if (currentGrabItems && currentGrabItems->
contains(
item)) {
2478 if (formerTargetItem && currentGrabItems) {
2479 QDragLeaveEvent leaveEvent;
2484 currentGrabItems->
removeAll(formerTarget);
2486 }
else if (itemIndex >= 0) {
2491 QDragMoveEvent translatedEvent(
p.toPoint(),
event->possibleActions(),
event->mimeData(),
2494 translatedEvent.setAccepted(
event->isAccepted());
2496 event->setAccepted(translatedEvent.isAccepted());
2497 event->setDropAction(translatedEvent.dropAction());
2499 if (translatedEvent.isAccepted()) {
2503 }
else if (itemIndex < 0) {
2516 if (deliverDragEvent(grabber,
children.
at(ii), &enterEvent, currentGrabItems, formerTarget))
2544 if (!filteringParent)
2546 bool filtered =
false;
2552 const bool wasAccepted =
event->allPointsAccepted();
2555 event->setAccepted(
true);
2556 auto oldMouseGrabber =
event->exclusiveGrabber(
event->point(0));
2558 qCDebug(lcMouse) <<
"mouse event intercepted by childMouseEventFilter of " << filteringParent;
2561 if (
event->isAccepted() &&
event->isBeginEvent()) {
2562 auto &point =
event->point(0);
2563 auto mouseGrabber =
event->exclusiveGrabber(point);
2564 if (mouseGrabber && mouseGrabber != receiver && mouseGrabber != oldMouseGrabber) {
2567 event->setExclusiveGrabber(point, receiver);
2572 event->setAccepted(wasAccepted);
2577 auto device =
event->device();
2580 qCDebug(lcTouchTarget) <<
"skipping filtering of synth-mouse event from" <<
device;
2587 qCDebug(lcTouch) <<
"letting parent" << filteringParent <<
"filter for" << receiver << &filteringParentTouchEvent;
2589 qCDebug(lcTouch) <<
"touch event intercepted by childMouseEventFilter of " << filteringParent;
2591 for (
auto point : filteringParentTouchEvent.points()) {
2593 if (!exclusiveGrabber || !exclusiveGrabber->
keepTouchGrab())
2594 event->setExclusiveGrabber(point, filteringParent);
2599 qCDebug(lcTouch) <<
"touch event NOT intercepted by childMouseEventFilter of " << filteringParent
2601 <<
"receiver accepts touch?" << acceptsTouchEvents
2602 <<
"so, letting parent filter a synth-mouse event";
2604 for (
auto &tp : filteringParentTouchEvent.points()) {
2606 switch (tp.state()) {
2633 qCDebug(lcTouch) <<
"touch event intercepted as synth mouse event by childMouseEventFilter of " << filteringParent;
2636 qCDebug(lcTouchTarget) <<
"TP (mouse)" <<
Qt::hex << tp.id() <<
"->" << filteringParent;
2637 filteringParentTouchEvent.setExclusiveGrabber(tp, filteringParent);
2638 touchMouseUnset =
false;
2644 if (touchMouseUnset)
2675 if (!filteringParent)
2682 bool filtered =
false;
2689 qCDebug(lcMouseTarget) <<
"for" << receiver << filteringParent <<
"childMouseEventFilter ->" << filtered;
2707 bool overThreshold =
qAbs(
d) > (startDragThreshold >= 0 ? startDragThreshold : styleHints->
startDragDistance());
2708 if (dragVelocityLimitAvailable) {
2709 QVector2D velocityVec =
event->point(0).velocity();
2713 return overThreshold;
2726 bool overThreshold =
qAbs(
d) > (startDragThreshold >= 0 ? startDragThreshold : styleHints->
startDragDistance());
2728 if (!overThreshold && dragVelocityLimitAvailable) {
2732 return overThreshold;
2742 int threshold =
qApp->styleHints()->startDragDistance();
2743 return qAbs(delta.
x()) > threshold ||
qAbs(delta.
y()) > threshold;
2746#ifndef QT_NO_DEBUG_STREAM
2752 debug <<
"QQuickDeliveryAgent(0)";
2756 debug <<
"QQuickDeliveryAgent(";
2761 debug <<
"root=" << root->metaObject()->className();
2762 if (!root->objectName().isEmpty())
2763 debug <<
' ' << root->objectName();
2774#include "moc_qquickdeliveryagent_p.cpp"
IOBluetoothDevice * device
static bool sendEvent(QObject *receiver, QEvent *event)
Sends event event directly to receiver receiver, using the notify() function.
static bool testAttribute(Qt::ApplicationAttribute attribute)
Returns true if attribute attribute is set; otherwise returns false.
The QEventPoint class provides information about a point in a QPointerEvent.
int id
the ID number of this event point.
QPointF scenePosition
the scene position of this point.
void setAccepted(bool accepted=true)
ulong timestamp
the most recent time at which this point was included in a QPointerEvent.
QPointF sceneLastPosition
the scene position of this point from the previous press or move event.
const QPointingDevice * device
the pointing device from which this event point originates.
QVector2D velocity
a velocity vector, in units of pixels per second, in the coordinate.
Type
This enum type defines the valid event types in Qt.
Type type() const
Returns the event type.
void accept()
Sets the accept flag of the event object, the equivalent of calling setAccepted(true).
bool isEmpty() const noexcept
bool contains(const Key &key) const
iterator erase(iterator it)
The QFocusEvent class contains event parameters for widget focus events.
virtual bool contains(const QPointF &point) const
Returns true if this item contains point, which is in local coordinates; otherwise,...
QGraphicsWidget * window() const
bool isEnabled() const
Returns true if the item is enabled; otherwise, false is returned.
bool acceptHoverEvents() const
Qt::MouseButtons acceptedMouseButtons() const
Returns the mouse buttons that this item accepts mouse events for.
QVariant data(int key) const
Returns this item's custom data for the key key as a QVariant.
QGraphicsItem * parentItem() const
Returns a pointer to this item's parent item.
bool isVisible() const
Returns true if the item is visible; otherwise, false is returned.
bool acceptTouchEvents() const
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 QPlatformTheme * platformTheme()
static QWindowList allWindows()
Returns a list of all the windows in the application.
static QObject * focusObject()
Returns the QObject in currently active window that will be final receiver of events tied to focus,...
static QStyleHints * styleHints()
Returns the application's style hints.
static QWindow * focusWindow()
Returns the QWindow that receives events tied to focus, such as key events.
static QInputMethod * inputMethod()
returns the input method.
static Qt::KeyboardModifiers keyboardModifiers()
Returns the current state of the modifier keys on the keyboard.
The QKeyEvent class describes a key event.
qsizetype size() const noexcept
bool isEmpty() const noexcept
iterator insert(qsizetype i, parameter_type t)
const_reference at(qsizetype i) const noexcept
qsizetype removeAll(const AT &t)
qsizetype count() const noexcept
void append(parameter_type t)
static Q_GUI_EXPORT void detach(QEventPoint &p)
static Q_GUI_EXPORT void setTimestamp(QEventPoint &p, ulong t)
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)
static QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *member, Qt::ConnectionType=Qt::AutoConnection)
\threadsafe
QString objectName
the name of this object
void destroyed(QObject *=nullptr)
This signal is emitted immediately before the object obj is destroyed, after any instances of QPointe...
\inmodule QtCore\reentrant
bool isNull() const noexcept
Returns true if both the x and y coordinates are set to 0.0 (ignoring the sign); otherwise returns fa...
\inmodule QtCore\reentrant
constexpr int x() const noexcept
Returns the x coordinate of this point.
constexpr int y() const noexcept
Returns the y coordinate of this point.
A base class for pointer events.
virtual bool isEndEvent() const
qsizetype pointCount() const
Returns the number of points in this pointer event.
const QPointingDevice * pointingDevice() const
Returns the source device from which this event originates.
void setTimestamp(quint64 timestamp) override
void setExclusiveGrabber(const QEventPoint &point, QObject *exclusiveGrabber)
Informs the delivery logic that the given exclusiveGrabber is to receive all future update events and...
virtual bool isBeginEvent() const
QEventPoint & point(qsizetype i)
Returns a QEventPoint reference for the point at index i.
QObject * exclusiveGrabber(const QEventPoint &point) const
Returns the object which has been set to receive all future update events and the release event conta...
QList< QPointer< QObject > > passiveGrabbers(const QEventPoint &point) const
Returns the list of objects that have been requested to receive all future update events and the rele...
virtual void setAccepted(bool accepted) override
\reimp
const QList< QEventPoint > & points() const
Returns a list of points in this pointer event.
virtual bool isUpdateEvent() const
static bool setPassiveGrabberContext(EventPointData *epd, QObject *grabber, QObject *context)
EventPointData * queryPointById(int id) const
static QPointingDevicePrivate * get(QPointingDevice *q)
The QPointingDevice class describes a device from which mouse, touch or tablet events originate.
GrabTransition
This enum represents a transition of exclusive or passive grab from one object (possibly nullptr) to ...
void grabChanged(QObject *grabber, QPointingDevice::GrabTransition transition, const QPointerEvent *event, const QEventPoint &point)
This signal is emitted when the grabber object gains or loses an exclusive or passive grab of point d...
bool hasStartAnimationPending() const
static QQmlAnimationTimer * instance()
QQuickItem * lastUngrabbed
void removeGrabber(QQuickItem *grabber, bool mouse=true, bool touch=true, bool cancel=false)
Ungrabs all touchpoint grabs and/or the mouse grab from the given item grabber.
bool frameSynchronousHoverEnabled
bool deliverPressOrReleaseEvent(QPointerEvent *, bool handlersOnly=false)
void deliverPointerEvent(QPointerEvent *)
void touchToMouseEvent(QEvent::Type type, const QEventPoint &p, const QTouchEvent *touchEvent, QMutableSinglePointEvent *mouseEvent)
QFlatMap< QPointer< QQuickItem >, uint > hoverItems
void handleWindowHidden(QQuickWindow *win)
static bool subsceneAgentsExist
bool sendFilteredPointerEvent(QPointerEvent *event, QQuickItem *receiver, QQuickItem *filteringParent=nullptr)
@ DontChangeFocusProperty
QStack< QPointerEvent * > eventsInDelivery
~QQuickDeliveryAgentPrivate()
Qt::FocusReason lastFocusReason
QList< const QPointingDevice * > knownPointingDevices
QVector< QQuickItem * > mergePointerTargets(const QVector< QQuickItem * > &list1, const QVector< QQuickItem * > &list2) const
bool sendHoverEvent(QEvent::Type, QQuickItem *, const QPointF &scenePos, const QPointF &lastScenePos, Qt::KeyboardModifiers modifiers, ulong timestamp)
bool deliverHoverEventRecursive(QQuickItem *, const QPointF &scenePos, const QPointF &lastScenePos, Qt::KeyboardModifiers modifiers, ulong timestamp)
bool deliverTouchAsMouse(QQuickItem *item, QTouchEvent *pointerEvent)
QList< QObject * > exclusiveGrabbers(QPointerEvent *ev)
void onGrabChanged(QObject *grabber, QPointingDevice::GrabTransition transition, const QPointerEvent *event, const QEventPoint &point)
QVector< QQuickItem * > hasFiltered
static bool isTabletEvent(const QPointerEvent *ev)
static QQuickPointingDeviceExtra * deviceExtra(const QInputDevice *device)
void deliverUpdatedPoints(QPointerEvent *event)
bool allowChildEventFiltering
static bool anyPointGrabbed(const QPointerEvent *ev)
void translateTouchEvent(QTouchEvent *touchEvent)
void deliverKeyEvent(QKeyEvent *e)
static bool allPointsGrabbed(const QPointerEvent *ev)
bool sendFilteredMouseEvent(QEvent *event, QQuickItem *receiver, QQuickItem *filteringParent)
void updateFocusItemTransform()
bool sendFilteredPointerEventImpl(QPointerEvent *event, QQuickItem *receiver, QQuickItem *filteringParent)
static bool isMouseOrWheelEvent(const QPointerEvent *ev)
QVector< QQuickItem * > pointerTargets(QQuickItem *, const QPointerEvent *event, const QEventPoint &point, bool checkMouseButtons, bool checkAcceptsTouch) const
std::unique_ptr< QMutableTouchEvent > delayedTouch
static bool isHoverEvent(const QPointerEvent *ev)
void handleWindowDeactivate(QQuickWindow *win)
QPointF lastMousePosition
uchar compressedTouchCount
bool compressTouchEvent(QTouchEvent *)
static QQuickDeliveryAgent * currentEventDeliveryAgent
QQuickDeliveryAgent::Transform * sceneTransform
QQuickItem * activeFocusItem
bool deliverHoverEventToItem(QQuickItem *item, const QPointF &scenePos, const QPointF &lastScenePos, Qt::KeyboardModifiers modifiers, ulong timestamp, bool clearHover)
void deliverMatchingPointsToItem(QQuickItem *item, bool isGrabber, QPointerEvent *pointerEvent, bool handlersOnly=false)
void handleTouchEvent(QTouchEvent *)
bool checkIfDoubleTapped(ulong newPressEventTimestamp, QPoint newPressPos)
bool isDeliveringTouchAsMouse() const
static bool isSynthMouse(const QPointerEvent *ev)
static bool isTouchEvent(const QPointerEvent *ev)
static bool isMouseEvent(const QPointerEvent *ev)
static QPointerEvent * clonePointerEvent(QPointerEvent *event, std::optional< QPointF > transformedLocalPos=std::nullopt)
int pointerEventRecursionGuard
QPointingDevicePrivate::EventPointData * mousePointData()
bool allUpdatedPointsAccepted(const QPointerEvent *ev)
void cancelTouchMouseSynthesis()
void handleMouseEvent(QMouseEvent *)
Handle event on behalf of this delivery agent's window or subscene.
QPointerEvent * eventInDelivery() const
ulong touchMousePressTimestamp
static void notifyFocusChangesRecur(QQuickItem **item, int remaining, Qt::FocusReason reason)
static QQuickDeliveryAgent * currentOrItemDeliveryAgent(const QQuickItem *item)
bool deliverSinglePointEventUntilAccepted(QPointerEvent *)
bool clearHover(ulong timestamp=0)
bool deliverTouchCancelEvent(QTouchEvent *)
bool hoveredLeafItemFound
void deliverDelayedTouchEvent()
static bool dragOverThreshold(qreal d, Qt::Axis axis, QMouseEvent *event, int startDragThreshold=-1)
QQuickDeliveryAgentPrivate(QQuickItem *root)
void deliverToPassiveGrabbers(const QVector< QPointer< QObject > > &passiveGrabbers, QPointerEvent *pointerEvent)
const QPointingDevice * touchMouseDevice
static bool isEventFromMouseOrTouchpad(const QPointerEvent *ev)
bool deliverHoverEvent(const QPointF &scenePos, const QPointF &lastScenePos, Qt::KeyboardModifiers modifiers, ulong timestamp)
void ensureDeviceConnected(const QPointingDevice *dev)
QPoint touchMousePressPos
static void localizePointerEvent(QPointerEvent *ev, const QQuickItem *dest)
QVector< QQuickItem * > skipDelivery
void flushFrameSynchronousEvents(QQuickWindow *win)
void setFocusInScope(QQuickItem *scope, QQuickItem *item, Qt::FocusReason reason, FocusOptions={ })
Set the focus inside scope to be item.
void clearFocusInScope(QQuickItem *scope, QQuickItem *item, Qt::FocusReason reason, FocusOptions={ })
Transform * sceneTransform() const
virtual ~QQuickDeliveryAgent()
void setSceneTransform(Transform *transform)
QQuickItem * rootItem() const
QQuickDeliveryAgent(QQuickItem *rootItem)
bool event(QEvent *ev) override
Handle ev on behalf of this delivery agent's window or subscene.
iterator release(iterator at)
ItemList::iterator iterator
void grab(QQuickItem *item)
void setTarget(QObject *target)
void copyActions(const QDropEvent &from)
virtual void itemFocusChanged(QQuickItem *, Qt::FocusReason)
quint32 replayingPressEvent
QLazilyAllocated< ExtraData, ExtraDataTags > extra
void notifyChangeListeners(QQuickItemPrivate::ChangeTypes changeTypes, Fn &&function, Args &&...args)
QList< QQuickItem * > paintOrderChildItems() const
QQuickDeliveryAgent * deliveryAgent()
virtual bool handlePointerEvent(QPointerEvent *, bool avoidGrabbers=false)
quint32 maybeHasSubsceneDeliveryAgent
bool hasPointerHandlers() const
quint32 subtreeHoverEnabled
QPointer< QQuickItem > subFocusItem
QTransform itemToWindowTransform() const
Returns a transform that maps points from item space into window space.
void itemChange(QQuickItem::ItemChange, const QQuickItem::ItemChangeData &)
quint32 notifiedActiveFocus
quint32 filtersChildMouseEvents
void localizedTouchEvent(const QTouchEvent *event, bool isFiltering, QMutableTouchEvent *localized)
Qt::MouseButtons acceptedMouseButtons() const
void updateSubFocusItem(QQuickItem *scope, bool focus)
Clears all sub focus items from scope.
static QQuickItemPrivate * get(QQuickItem *item)
The QQuickItem class provides the most basic of all visual items in \l {Qt Quick}.
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...
bool acceptTouchEvents() const
Returns whether touch events are accepted by this item.
Qt::MouseButtons acceptedMouseButtons() const
Returns the mouse buttons accepted by this item.
bool isFocusScope() const
Returns true if this item is a focus scope, and false otherwise.
virtual void mouseUngrabEvent()
This event handler can be reimplemented in a subclass to be notified when a mouse ungrab event has oc...
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 keepTouchGrab() const
Returns whether the touch points grabbed by this item should exclusively remain with this item.
QQuickWindow * window() const
Returns the window in which this item is rendered.
QQuickItem * scopedFocusItem() const
If this item is a focus scope, this returns the item in its focus chain that currently has focus.
QQuickItem * parentItem() const
bool filtersChildMouseEvents() const
Returns whether pointer events intended for this item's children should be filtered through this item...
virtual void touchUngrabEvent()
This event handler can be reimplemented in a subclass to be notified when a touch ungrab event has oc...
virtual bool childMouseEventFilter(QQuickItem *, QEvent *)
Reimplement this method to filter the pointer events that are received by this item's children.
@ ItemActiveFocusHasChanged
@ ItemClipsChildrenToShape
static QVector< QObject * > & deviceDeliveryTargets(const QInputDevice *device)
void handlePointerEvent(QPointerEvent *event)
static bool isRenderWindowFor(QQuickWindow *quickWin, const QWindow *renderWin)
static QQuickWindowPrivate * get(QQuickWindow *c)
QQuickItem * dirtyItemList
QQuickDeliveryAgentPrivate * deliveryAgentPrivate() const
QQuickDeliveryAgent * deliveryAgent
\qmltype Window \instantiates QQuickWindow \inqmlmodule QtQuick
\inmodule QtCore\reentrant
A base class for pointer events containing a single point, such as mouse events.
QPointF scenePosition() const
Returns the position of the point in this event, relative to the window or scene.
T & top()
Returns a reference to the stack's top item.
T pop()
Removes the top item from the stack and returns it.
void push(const T &t)
Adds element t to the top of the stack.
\macro QT_RESTRICTED_CAST_FROM_ASCII
bool isEmpty() const
Returns true if the string has no characters; otherwise returns false.
The QStyleHints class contains platform specific hints and settings. \inmodule QtGui.
int startDragDistance
the distance, in pixels, that the mouse must be moved with a button held down before a drag and drop ...
int startDragVelocity
the limit for the velocity, in pixels per second, that the mouse may be moved, with a button held dow...
int touchDoubleTapDistance
the maximum distance, in pixels, that a finger can be moved between two consecutive taps and still ha...
QEventPoint & point(int touchId)
QMap< int, QEventPoint > points
The QTouchEvent class contains parameters that describe a touch event.
constexpr size_type size() const noexcept
void remove(qsizetype i, qsizetype n=1)
const T & at(qsizetype idx) const
void resize(qsizetype sz)
qsizetype indexOf(const AT &t, qsizetype from=0) const
qsizetype removeAll(const AT &t)
bool contains(const AT &t) const
iterator begin() noexcept
int toInt(bool *ok=nullptr) const
Returns the variant as an int if the variant has userType() \l QMetaType::Int, \l QMetaType::Bool,...
The QVector2D class represents a vector or vertex in 2D space.
constexpr float y() const noexcept
Returns the y coordinate of this point.
constexpr float x() const noexcept
Returns the x coordinate of this point.
void focusObjectChanged(QObject *object)
This signal is emitted when the final receiver of events tied to focus is changed to object.
EGLImageKHR int int EGLuint64KHR * modifiers
QSet< QString >::iterator it
Combined button and popup list for selecting options.
@ ImInputItemClipRectangle
QTextStream & hex(QTextStream &stream)
Calls QTextStream::setIntegerBase(16) on stream and returns stream.
@ MouseEventSynthesizedByQt
@ MouseEventSynthesizedBySystem
@ AA_SynthesizeMouseForUnhandledTouchEvents
std::pair< T1, T2 > QPair
#define Q_LOGGING_CATEGORY(name,...)
#define qCWarning(category,...)
#define qCDebug(category,...)
constexpr T qAbs(const T &t)
Q_CORE_EXPORT Q_DECL_CONST_FUNCTION double qInf()
static bool contains(const QJsonArray &haystack, unsigned needle)
GLfloat GLfloat GLfloat w
[0]
GLenum GLenum GLsizei count
GLfloat GLfloat GLfloat GLfloat h
GLuint GLenum GLenum transform
GLsizei const void * pointer
GLdouble GLdouble GLdouble GLdouble q
constexpr decltype(auto) qMakePair(T1 &&value1, T2 &&value2) noexcept(noexcept(std::make_pair(std::forward< T1 >(value1), std::forward< T2 >(value2))))
T qmlobject_cast(QObject *object)
This method is identical to qobject_cast<T>() except that it does not require lazy QMetaObjects to be...
QQuickItem * qmlobject_cast< QQuickItem * >(QObject *object)
static bool allowSyntheticRightClick()
QT_BEGIN_NAMESPACE Q_GUI_EXPORT bool qt_sendShortcutOverrideEvent(QObject *o, ulong timestamp, int k, Qt::KeyboardModifiers mods, const QString &text=QString(), bool autorep=false, ushort count=1)
static bool windowHasFocus(QQuickWindow *win)
QDebug operator<<(QDebug debug, const QQuickDeliveryAgent *da)
QQuickItem * qobject_cast< QQuickItem * >(QObject *o)
const QQuickItem * qobject_cast< const QQuickItem * >(const QObject *o)
const QQuickItem * rootItem(const I &item)
#define Q_QUICK_INPUT_PROFILE(Type, DetailType, A, B)
QScopeGuard< typename std::decay< F >::type > qScopeGuard(F &&f)
[qScopeGuard]
Q_CORE_EXPORT bool qEnvironmentVariableIsSet(const char *varName) noexcept
Q_CORE_EXPORT int qEnvironmentVariableIntValue(const char *varName, bool *ok=nullptr) noexcept
Q_GUI_EXPORT bool qt_sendShortcutOverrideEvent(QObject *o, ulong timestamp, int k, Qt::KeyboardModifiers mods, const QString &text=QString(), bool autorep=false, ushort count=1)
bool contains(const AT &t) const noexcept
qsizetype lastIndexOf(const AT &t, qsizetype from=-1) const noexcept