1823void QApplicationPrivate::setActiveWindow(QWidget* act)
1825 QWidget* window = act?act->window():
nullptr;
1827 if (QApplicationPrivate::active_window == window)
1830#if QT_CONFIG(graphicsview)
1831 if (window && window->graphicsProxyWidget()) {
1837 QWidgetList toBeActivated;
1838 QWidgetList toBeDeactivated;
1840 if (QApplicationPrivate::active_window) {
1841 if (QApplication::style()->styleHint(QStyle::SH_Widget_ShareActivation,
nullptr, QApplicationPrivate::active_window)) {
1842 const QWidgetList list = QApplication::topLevelWidgets();
1843 for (
auto *w : list) {
1844 if (w->isVisible() && w->isActiveWindow())
1845 toBeDeactivated.append(w);
1848 toBeDeactivated.append(QApplicationPrivate::active_window);
1852 if (QApplicationPrivate::focus_widget) {
1853 if (QApplicationPrivate::focus_widget->testAttribute(Qt::WA_InputMethodEnabled))
1854 QGuiApplication::inputMethod()->commit();
1856 QFocusEvent focusAboutToChange(QEvent::FocusAboutToChange, Qt::ActiveWindowFocusReason);
1857 QCoreApplication::sendEvent(QApplicationPrivate::focus_widget, &focusAboutToChange);
1860 QApplicationPrivate::active_window = window;
1862 if (QApplicationPrivate::active_window) {
1863 if (QApplication::style()->styleHint(QStyle::SH_Widget_ShareActivation,
nullptr, QApplicationPrivate::active_window)) {
1864 const QWidgetList list = QApplication::topLevelWidgets();
1865 for (
auto *w : list) {
1866 if (w->isVisible() && w->isActiveWindow())
1867 toBeActivated.append(w);
1870 toBeActivated.append(QApplicationPrivate::active_window);
1876 QEvent activationChange(QEvent::ActivationChange);
1877 QEvent windowActivate(QEvent::WindowActivate);
1878 QEvent windowDeactivate(QEvent::WindowDeactivate);
1880 for (
int i = 0; i < toBeActivated.size(); ++i) {
1881 QWidget *w = toBeActivated.at(i);
1882 QApplication::sendSpontaneousEvent(w, &windowActivate);
1883 QApplication::sendSpontaneousEvent(w, &activationChange);
1886 for(
int i = 0; i < toBeDeactivated.size(); ++i) {
1887 QWidget *w = toBeDeactivated.at(i);
1888 QApplication::sendSpontaneousEvent(w, &windowDeactivate);
1889 QApplication::sendSpontaneousEvent(w, &activationChange);
1892 if (!inPopupMode()) {
1894 if (!QApplicationPrivate::active_window && QApplicationPrivate::focus_widget) {
1895 QApplicationPrivate::setFocusWidget(
nullptr, Qt::ActiveWindowFocusReason);
1896 }
else if (QApplicationPrivate::active_window) {
1897 QWidget *w = QApplicationPrivate::active_window->focusWidget();
1898 if (w && w->isVisible() )
1899 w->setFocus(Qt::ActiveWindowFocusReason);
1901 w = QApplicationPrivate::focusNextPrevChild_helper(QApplicationPrivate::active_window,
true);
1903 w->setFocus(Qt::ActiveWindowFocusReason);
1905 w = QApplicationPrivate::focus_widget;
1906 if (!w && QApplicationPrivate::active_window->focusPolicy() != Qt::NoFocus) {
1907 QApplicationPrivate::active_window->setFocus(Qt::ActiveWindowFocusReason);
1908 }
else if (!QApplicationPrivate::active_window->isAncestorOf(w)) {
1910 QApplicationPrivate::setFocusWidget(
nullptr, Qt::ActiveWindowFocusReason);
2046void QApplicationPrivate::dispatchEnterLeave(QWidget* enter, QWidget* leave,
const QPointF &globalPosF)
2048 if ((!enter && !leave) || (enter == leave))
2051 QWidgetList leaveList;
2052 QWidgetList enterList;
2054 bool sameWindow = leave && enter && leave->window() == enter->window();
2055 if (leave && !sameWindow) {
2058 leaveList.append(w);
2059 }
while (!w->isWindow() && (w = w->parentWidget()));
2061 if (enter && !sameWindow) {
2064 enterList.append(w);
2065 }
while (!w->isWindow() && (w = w->parentWidget()));
2071 while (!e->isWindow() && (e = e->parentWidget()))
2074 while (!l->isWindow() && (l = l->parentWidget()))
2076 QWidget* wenter = enter;
2077 QWidget* wleave = leave;
2078 while (enterDepth > leaveDepth) {
2079 wenter = wenter->parentWidget();
2082 while (leaveDepth > enterDepth) {
2083 wleave = wleave->parentWidget();
2086 while (!wenter->isWindow() && wenter != wleave) {
2087 wenter = wenter->parentWidget();
2088 wleave = wleave->parentWidget();
2091 for (
auto *w = leave; w != wleave; w = w->parentWidget())
2092 leaveList.append(w);
2094 for (
auto *w = enter; w != wenter; w = w->parentWidget())
2095 enterList.append(w);
2098 QEvent leaveEvent(QEvent::Leave);
2099 for (
int i = 0; i < leaveList.size(); ++i) {
2100 auto *w = leaveList.at(i);
2101 if (!QApplication::activeModalWidget() || QApplicationPrivate::tryModalHelper(w,
nullptr)) {
2102 QCoreApplication::sendEvent(w, &leaveEvent);
2103 if (w->testAttribute(Qt::WA_Hover) &&
2104 (!QApplication::activePopupWidget() || QApplication::activePopupWidget() == w->window())) {
2105 Q_ASSERT(instance());
2106 QHoverEvent he(QEvent::HoverLeave, QPointF(-1, -1), globalPosF, w->mapFromGlobal(globalPosF),
2107 QGuiApplication::keyboardModifiers());
2108 qApp->d_func()->notify_helper(w, &he);
2112 if (!enterList.isEmpty()) {
2114 const QPointF globalPos = qIsInf(globalPosF.x())
2117 const QPointF windowPos = std::as_const(enterList).back()->window()->mapFromGlobal(globalPos);
2118 for (
auto it = enterList.crbegin(), end = enterList.crend(); it != end; ++it) {
2120 if (!QApplication::activeModalWidget() || QApplicationPrivate::tryModalHelper(w,
nullptr)) {
2121 const QPointF localPos = w->mapFromGlobal(globalPos);
2122 QEnterEvent enterEvent(localPos, windowPos, globalPos);
2123 QCoreApplication::sendEvent(w, &enterEvent);
2124 if (w->testAttribute(Qt::WA_Hover) &&
2125 (!QApplication::activePopupWidget() || QApplication::activePopupWidget() == w->window())) {
2126 QHoverEvent he(QEvent::HoverEnter, windowPos, QPointF(-1, -1), globalPos,
2127 QGuiApplication::keyboardModifiers());
2128 QMutableEventPoint::setPosition(he.point(0), localPos);
2129 qApp->d_func()->notify_helper(w, &he);
2138 const bool enterOnAlien = (enter && (isAlien(enter) || enter->testAttribute(Qt::WA_DontShowOnScreen)));
2141 QWidget *parentOfLeavingCursor =
nullptr;
2142 for (
int i = 0; i < leaveList.size(); ++i) {
2143 auto *w = leaveList.at(i);
2146 if (w->testAttribute(Qt::WA_SetCursor)) {
2147 QWidget *parent = w->parentWidget();
2148 while (parent && parent->d_func()->data.in_destructor)
2149 parent = parent->parentWidget();
2150 parentOfLeavingCursor = parent;
2156 if (parentOfLeavingCursor && (!enterOnAlien
2157 || parentOfLeavingCursor->effectiveWinId() != enter->effectiveWinId())) {
2158#if QT_CONFIG(graphicsview)
2159 if (!parentOfLeavingCursor->window()->graphicsProxyWidget())
2162 if (enter == QApplicationPrivate::desktop()) {
2163 qt_qpa_set_cursor(enter,
true);
2165 qt_qpa_set_cursor(parentOfLeavingCursor,
true);
2170 QWidget *cursorWidget = enter;
2171 while (!cursorWidget->isWindow() && !cursorWidget->isEnabled())
2172 cursorWidget = cursorWidget->parentWidget();
2177#if QT_CONFIG(graphicsview)
2178 if (cursorWidget->window()->graphicsProxyWidget()) {
2179 QWidgetPrivate::nearestGraphicsProxyWidget(cursorWidget)->setCursor(cursorWidget->cursor());
2183 qt_qpa_set_cursor(cursorWidget,
true);
2581bool QApplication::notify(QObject *receiver, QEvent *e)
2585 if (QApplicationPrivate::is_app_closing)
2588 if (Q_UNLIKELY(!receiver)) {
2589 qWarning(
"QApplication::notify: Unexpected null receiver");
2594 QCoreApplicationPrivate::checkReceiverThread(receiver);
2597 const bool isWindowType = receiver->isWindowType();
2598 const bool isWidgetType = receiver->isWidgetType();
2600 && QGuiApplicationPrivate::sendQWindowEventToQPlatformWindow(
static_cast<QWindow *>(receiver), e)) {
2604 QGuiApplicationPrivate::captureGlobalModifierState(e);
2606#ifndef QT_NO_GESTURES
2608 if (d->gestureManager) {
2609 switch (e->type()) {
2611 case QEvent::MetaCall:
2612 case QEvent::DeferredDelete:
2613 case QEvent::DragEnter:
case QEvent::DragMove:
case QEvent::DragLeave:
2614 case QEvent::Drop:
case QEvent::DragResponse:
2615 case QEvent::ChildAdded:
case QEvent::ChildPolished:
2616 case QEvent::ChildRemoved:
2617 case QEvent::UpdateRequest:
2618 case QEvent::UpdateLater:
2619 case QEvent::LocaleChange:
2621 case QEvent::IconDrag:
2622 case QEvent::StyleChange:
2623 case QEvent::GraphicsSceneDragEnter:
2624 case QEvent::GraphicsSceneDragMove:
2625 case QEvent::GraphicsSceneDragLeave:
2626 case QEvent::GraphicsSceneDrop:
2627 case QEvent::DynamicPropertyChange:
2628 case QEvent::NetworkReplyUpdated:
2631 if (d->gestureManager->thread() == QThread::currentThread()) {
2633 if (d->gestureManager->filterEvent(
static_cast<QWidget *>(receiver), e))
2639 if (d->gestureManager->filterEvent(receiver, e))
2648 switch (e->type()) {
2649 case QEvent::ApplicationDeactivate:
2650 case QEvent::OrientationChange:
2654 d->closeAllPopups();
2657 case QEvent::ActivationChange:
2658 case QEvent::KeyPress:
2659 case QEvent::KeyRelease:
2660 case QEvent::FocusOut:
2661 case QEvent::FocusIn:
2662 case QEvent::MouseButtonPress:
2663 case QEvent::MouseButtonRelease:
2664 case QEvent::MouseButtonDblClick:
2665 d->toolTipFallAsleep.stop();
2668 d->toolTipWakeUp.stop();
2674 switch (e->type()) {
2675 case QEvent::KeyPress: {
2676 QKeyEvent* keyEvent =
static_cast<QKeyEvent*>(e);
2677 const int key = keyEvent->key();
2682 if (!e->spontaneous() && isWidgetType
2683 && qt_sendShortcutOverrideEvent(
static_cast<QWidget *>(receiver), keyEvent->timestamp(),
2684 key, keyEvent->modifiers(), keyEvent->text(),
2685 keyEvent->isAutoRepeat(), keyEvent->count())) {
2688 qt_in_tab_key_event = (key == Qt::Key_Backtab
2689 || key == Qt::Key_Tab
2690 || key == Qt::Key_Left
2691 || key == Qt::Key_Up
2692 || key == Qt::Key_Right
2693 || key == Qt::Key_Down);
2702 QWidget * w =
static_cast<QWidget *>(receiver);
2703 switch (e->type()) {
2704 case QEvent::ShortcutOverride:
2705 case QEvent::KeyPress:
2706 case QEvent::KeyRelease: {
2707 QKeyEvent* key =
static_cast<QKeyEvent*>(e);
2708 bool def = key->isAccepted();
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721 QPointer<QObject> pr = receiver;
2727 res = d->notify_helper(w, e);
2729 if (res && key->isAccepted())
2731 if (!pr || w->isWindow())
2734 w = w->parentWidget();
2736 qt_in_tab_key_event =
false;
2739 case QEvent::MouseButtonPress:
2740 case QEvent::MouseButtonRelease:
2741 case QEvent::MouseButtonDblClick:
2742 case QEvent::MouseMove: {
2743 QMouseEvent* mouse =
static_cast<QMouseEvent*>(e);
2744 QPoint relpos = mouse->position().toPoint();
2746 if (e->spontaneous()) {
2747 if (e->type() != QEvent::MouseMove)
2748 QApplicationPrivate::giveFocusAccordingToFocusPolicy(w, e, relpos);
2757 if (e->type() == QEvent::MouseMove && mouse->buttons() == 0
2758 && w->rect().contains(relpos)) {
2759 d->toolTipWidget = w;
2760 d->toolTipPos = relpos;
2761 d->toolTipGlobalPos = mouse->globalPosition().toPoint();
2762 QStyle *s = d->toolTipWidget->style();
2763 int wakeDelay = s->styleHint(QStyle::SH_ToolTip_WakeUpDelay,
nullptr, d->toolTipWidget,
nullptr);
2764 d->toolTipWakeUp.start(d->toolTipFallAsleep.isActive() ? 20 : wakeDelay,
this);
2768 bool eventAccepted = mouse->isAccepted();
2770 QPointer<QWidget> pw = w;
2772 QMouseEvent me(mouse->type(), relpos, mouse->scenePosition(), mouse->globalPosition().toPoint(),
2773 mouse->button(), mouse->buttons(), mouse->modifiers(), mouse->source(),
2774 mouse->pointingDevice());
2775 me.m_spont = mouse->spontaneous();
2776 me.setTimestamp(mouse->timestamp());
2777 QMutableSinglePointEvent::setDoubleClick(&me, QMutableSinglePointEvent::isDoubleClick(mouse));
2779 if (!w->hasMouseTracking()
2780 && mouse->type() == QEvent::MouseMove && mouse->buttons() == 0) {
2782 d->sendThroughApplicationEventFilters(w, w == receiver ? mouse : &me);
2785 w->setAttribute(Qt::WA_NoMouseReplay,
false);
2786 res = d->notify_helper(w, w == receiver ? mouse : &me);
2789 eventAccepted = (w == receiver ? mouse : &me)->isAccepted();
2790 if (res && eventAccepted)
2792 if (w->isWindow() || w->testAttribute(Qt::WA_NoMousePropagation))
2795 w = w->parentWidget();
2798 mouse->setAccepted(eventAccepted);
2800 if (e->type() == QEvent::MouseMove) {
2804 w =
static_cast<QWidget *>(receiver);
2805 relpos = mouse->position().toPoint();
2806 QPoint diff = relpos - w->mapFromGlobal(mouse->globalPosition().toPoint());
2808 if (w->testAttribute(Qt::WA_Hover) &&
2809 (!QApplication::activePopupWidget() || QApplication::activePopupWidget() == w->window())) {
2810 QHoverEvent he(QEvent::HoverMove, mouse->scenePosition(), mouse->globalPosition(), relpos - diff, mouse->modifiers());
2811 QMutableEventPoint::setPosition(he.point(0), relpos);
2812 d->notify_helper(w, &he);
2814 if (w->isWindow() || w->testAttribute(Qt::WA_NoMousePropagation))
2817 w = w->parentWidget();
2821 d->hoverGlobalPos = mouse->globalPosition().toPoint();
2824#if QT_CONFIG(wheelevent)
2825 case QEvent::Wheel: {
2827 if (
const QWidget *popup = QApplication::activePopupWidget()) {
2828 if (w->window() != popup)
2832 QWheelEvent* wheel =
static_cast<QWheelEvent*>(e);
2833 if (!wheel->spontaneous()) {
2835
2836
2837
2838
2839 res = d->notify_helper(w, wheel);
2843 const Qt::ScrollPhase phase = wheel->phase();
2844 QPoint relpos = wheel->position().toPoint();
2867 if (QApplicationPrivate::wheel_widget) {
2868 Q_ASSERT(phase != Qt::NoScrollPhase);
2869 w = QApplicationPrivate::wheel_widget;
2870 relpos = w->mapFromGlobal(wheel->globalPosition().toPoint());
2873
2874
2875
2876
2879 QApplicationPrivate::wheel_widget =
nullptr;
2881 case Qt::ScrollBegin:
2882 QApplicationPrivate::wheel_widget = w;
2884 case Qt::ScrollUpdate:
2885 case Qt::ScrollMomentum:
2886 if (!QApplicationPrivate::wheel_widget)
2887 QApplicationPrivate::wheel_widget = w;
2889 case Qt::NoScrollPhase:
2890 QApplicationPrivate::giveFocusAccordingToFocusPolicy(w, e, relpos);
2895 QWheelEvent we(relpos, wheel->globalPosition(), wheel->pixelDelta(), wheel->angleDelta(), wheel->buttons(),
2896 wheel->modifiers(), phase, wheel->inverted(), wheel->source(), wheel->pointingDevice());
2898 we.setTimestamp(wheel->timestamp());
2903 we.setAccepted(
true);
2904 we.m_spont = wheel->spontaneous() && w == receiver;
2905 res = d->notify_helper(w, &we);
2906 eventAccepted = we.isAccepted();
2907 if (res && eventAccepted)
2909 if (w->isWindow() || w->testAttribute(Qt::WA_NoMousePropagation))
2912 QMutableEventPoint::setPosition(we.point(0), we.position() + w->pos());
2913 w = w->parentWidget();
2915 wheel->setAccepted(eventAccepted);
2919#ifndef QT_NO_CONTEXTMENU
2920 case QEvent::ContextMenu: {
2921 QContextMenuEvent *context =
static_cast<QContextMenuEvent*>(e);
2922 QPoint relpos = context->pos();
2923 bool eventAccepted = context->isAccepted();
2925 QContextMenuEvent ce(context->reason(), relpos, context->globalPos(), context->modifiers());
2926 ce.m_spont = e->spontaneous();
2927 res = d->notify_helper(w, w == receiver ? context : &ce);
2928 eventAccepted = ((w == receiver) ? context : &ce)->isAccepted();
2931 if (res && eventAccepted)
2933 if (w->isWindow() || w->testAttribute(Qt::WA_NoMousePropagation))
2937 w = w->parentWidget();
2939 context->setAccepted(eventAccepted);
2943#if QT_CONFIG(tabletevent)
2944 case QEvent::TabletMove:
2945 case QEvent::TabletPress:
2946 case QEvent::TabletRelease: {
2947 QTabletEvent *tablet =
static_cast<QTabletEvent*>(e);
2948 QPointF relpos = tablet->position();
2949 bool eventAccepted = tablet->isAccepted();
2951 QTabletEvent te(tablet->type(), tablet->pointingDevice(), relpos, tablet->globalPosition(),
2952 tablet->pressure(), tablet->xTilt(), tablet->yTilt(),
2953 tablet->tangentialPressure(), tablet->rotation(), tablet->z(),
2954 tablet->modifiers(), tablet->button(), tablet->buttons());
2955 te.m_spont = e->spontaneous();
2956 te.setTimestamp(tablet->timestamp());
2957 te.setAccepted(
false);
2958 res = d->notify_helper(w, w == receiver ? tablet : &te);
2959 eventAccepted = ((w == receiver) ? tablet : &te)->isAccepted();
2961 if (res && eventAccepted)
2963 if (w->isWindow() || w->testAttribute(Qt::WA_NoMousePropagation))
2967 w = w->parentWidget();
2969 tablet->setAccepted(eventAccepted);
2974#if QT_CONFIG(tooltip) || QT_CONFIG(whatsthis)
2975 case QEvent::ToolTip:
2976 case QEvent::WhatsThis:
2977 case QEvent::QueryWhatsThis: {
2978 QHelpEvent *help =
static_cast<QHelpEvent*>(e);
2979 QPoint relpos = help->pos();
2980 bool eventAccepted = help->isAccepted();
2982 QHelpEvent he(help->type(), relpos, help->globalPos());
2983 he.m_spont = e->spontaneous();
2984 res = d->notify_helper(w, w == receiver ? help : &he);
2986 eventAccepted = (w == receiver ? help : &he)->isAccepted();
2987 if (res && eventAccepted)
2993 w = w->parentWidget();
2995 help->setAccepted(eventAccepted);
2999#if QT_CONFIG(statustip) || QT_CONFIG(whatsthis)
3000 case QEvent::StatusTip:
3001 case QEvent::WhatsThisClicked:
3003 res = d->notify_helper(w, e);
3004 if (res && e->isAccepted())
3008 w = w->parentWidget();
3013#if QT_CONFIG(draganddrop)
3014 case QEvent::DragEnter: {
3015 QDragEnterEvent *dragEvent =
static_cast<QDragEnterEvent *>(e);
3016#if QT_CONFIG(graphicsview)
3019 const auto &extra = w->window()->d_func()->extra;
3020 if (extra && extra->proxyWidget) {
3021 res = d->notify_helper(w, dragEvent);
3026 if (w->isEnabled() && w->acceptDrops()) {
3027 res = d->notify_helper(w, dragEvent);
3028 if (res && dragEvent->isAccepted()) {
3029 QDragManager::self()->setCurrentTarget(w);
3035 dragEvent->m_pos = w->mapToParent(dragEvent->m_pos);
3036 w = w->parentWidget();
3040 case QEvent::DragMove:
3042 case QEvent::DragLeave: {
3043#if QT_CONFIG(graphicsview)
3046 const auto &extra = w->window()->d_func()->extra;
3047 bool isProxyWidget = extra && extra->proxyWidget;
3050 w = qobject_cast<QWidget *>(QDragManager::self()->currentTarget());
3057 if (e->type() == QEvent::DragLeave)
3058 w =
static_cast<QWidget *>(receiver);
3062 if (e->type() == QEvent::DragMove || e->type() == QEvent::Drop) {
3063 QDropEvent *dragEvent =
static_cast<QDropEvent *>(e);
3064 QWidget *origReceiver =
static_cast<QWidget *>(receiver);
3065 while (origReceiver && w != origReceiver) {
3066 dragEvent->m_pos = origReceiver->mapToParent(dragEvent->m_pos);
3067 origReceiver = origReceiver->parentWidget();
3070 res = d->notify_helper(w, e);
3071 if (e->type() != QEvent::DragMove
3072#if QT_CONFIG(graphicsview)
3076 QDragManager::self()->setCurrentTarget(
nullptr, e->type() == QEvent::Drop);
3080 case QEvent::TouchBegin: {
3082 QTouchEvent *touchEvent =
static_cast<QTouchEvent *>(e);
3083 bool eventAccepted = touchEvent->isAccepted();
3084 bool acceptTouchEvents = w->testAttribute(Qt::WA_AcceptTouchEvents);
3086 if (acceptTouchEvents && e->spontaneous()
3087 && touchEvent->device()->type() != QInputDevice::DeviceType::TouchPad) {
3088 const QPoint localPos = touchEvent->points()[0].position().toPoint();
3089 QApplicationPrivate::giveFocusAccordingToFocusPolicy(w, e, localPos);
3092#ifndef QT_NO_GESTURES
3093 QPointer<QWidget> gesturePendingWidget;
3098 acceptTouchEvents = w->testAttribute(Qt::WA_AcceptTouchEvents);
3099 QMutableTouchEvent::setTarget(touchEvent, w);
3100 touchEvent->setAccepted(acceptTouchEvents);
3101 QPointer<QWidget> p = w;
3102 res = acceptTouchEvents && d->notify_helper(w, touchEvent);
3103 eventAccepted = touchEvent->isAccepted();
3108 w->setAttribute(Qt::WA_WState_AcceptedTouchBeginEvent, res && eventAccepted);
3110 touchEvent->m_spont =
false;
3111 if (res && eventAccepted) {
3113 d->activateImplicitTouchGrab(w, touchEvent);
3116#ifndef QT_NO_GESTURES
3117 if (gesturePendingWidget.isNull() && w && QGestureManager::gesturePending(w))
3118 gesturePendingWidget = w;
3120 if (!w || w->isWindow() || w->testAttribute(Qt::WA_NoMousePropagation))
3123 const QPoint offset = w->pos();
3124 w = w->parentWidget();
3125 QMutableTouchEvent::setTarget(touchEvent, w);
3126 for (
int i = 0; i < touchEvent->pointCount(); ++i) {
3127 auto &pt = touchEvent->point(i);
3128 QMutableEventPoint::setPosition(pt, pt.position() + offset);
3132#ifndef QT_NO_GESTURES
3133 if (!eventAccepted && !gesturePendingWidget.isNull()) {
3136 d->activateImplicitTouchGrab(gesturePendingWidget, touchEvent, QApplicationPrivate::GrabAllPoints);
3140 touchEvent->setAccepted(eventAccepted);
3143 case QEvent::TouchUpdate:
3144 case QEvent::TouchEnd:
3148 if (w->testAttribute(Qt::WA_WState_AcceptedTouchBeginEvent))
3149 res = d->notify_helper(w, e);
3151 case QEvent::RequestSoftwareInputPanel:
3152 inputMethod()->show();
3154 case QEvent::CloseSoftwareInputPanel:
3155 inputMethod()->hide();
3158#ifndef QT_NO_GESTURES
3159 case QEvent::NativeGesture:
3162 res = d->notify_helper(w, e);
3163 if (res && e->isAccepted())
3167 w = w->parentWidget();
3170 case QEvent::Gesture:
3171 case QEvent::GestureOverride: {
3172 QGestureEvent *gestureEvent =
static_cast<QGestureEvent *>(e);
3173 QList<QGesture *> allGestures = gestureEvent->gestures();
3175 bool eventAccepted = gestureEvent->isAccepted();
3176 bool wasAccepted = eventAccepted;
3179 QList<QGesture *> gestures;
3180 QWidgetPrivate *wd = w->d_func();
3181 for (
int i = 0; i < allGestures.size();) {
3182 QGesture *g = allGestures.at(i);
3183 Qt::GestureType type = g->gestureType();
3184 QMap<Qt::GestureType, Qt::GestureFlags>::iterator contextit =
3185 wd->gestureContext.find(type);
3186 bool deliver = contextit != wd->gestureContext.end() &&
3187 (g->state() == Qt::GestureStarted || w == receiver ||
3188 (contextit.value() & Qt::ReceivePartialGestures));
3190 allGestures.removeAt(i);
3196 if (!gestures.isEmpty()) {
3197 QGestureEvent ge(gestures);
3198 ge.t = gestureEvent->t;
3199 ge.m_spont = gestureEvent->spontaneous();
3200 ge.m_accept = wasAccepted;
3201 ge.m_accepted = gestureEvent->m_accepted;
3202 res = d->notify_helper(w, &ge);
3203 gestureEvent->m_spont =
false;
3204 eventAccepted = ge.isAccepted();
3205 for (
int i = 0; i < gestures.size(); ++i) {
3206 QGesture *g = gestures.at(i);
3209 if (eventAccepted || ge.isAccepted(g)) {
3211 gestureEvent->m_targetWidgets[g->gestureType()] = w;
3212 gestureEvent->setAccepted(g,
true);
3216 allGestures.append(g);
3220 if (allGestures.isEmpty())
3224 w = w->parentWidget();
3226 for (QGesture *g : std::as_const(allGestures))
3227 gestureEvent->setAccepted(g,
false);
3228 gestureEvent->m_accept =
false;
3234 typedef void (*RegisterTouchWindowFn)(QWindow *,
bool);
3236 if (w->testAttribute(Qt::WA_AcceptTouchEvents)) {
3237 RegisterTouchWindowFn registerTouchWindow =
reinterpret_cast<RegisterTouchWindowFn>
3238 (platformNativeInterface()->nativeResourceFunctionForIntegration(
"registertouchwindow"));
3239 if (registerTouchWindow)
3240 registerTouchWindow(w->window()->windowHandle(),
true);
3242 res = d->notify_helper(receiver, e);
3245 if (w->testAttribute(Qt::WA_AcceptTouchEvents)) {
3246 RegisterTouchWindowFn registerTouchWindow =
reinterpret_cast<RegisterTouchWindowFn>
3247 (platformNativeInterface()->nativeResourceFunctionForIntegration(
"registertouchwindow"));
3248 if (registerTouchWindow)
3249 registerTouchWindow(w->window()->windowHandle(),
false);
3251 res = d->notify_helper(receiver, e);
3255 res = d->notify_helper(receiver, e);
3259 res = d->notify_helper(receiver, e);
3815bool QApplicationPrivate::translateRawTouchEvent(QWidget *window,
const QTouchEvent *te)
3817 QApplicationPrivate *d = self;
3819 typedef std::pair<QEventPoint::State, QList<QEventPoint> > StatesAndTouchPoints;
3820 QHash<QWidget *, StatesAndTouchPoints> widgetsNeedingEvents;
3822 const auto *device = te->pointingDevice();
3823 auto touchPoints = te->points();
3824 for (
auto &touchPoint : touchPoints) {
3826 QPointer<QObject> target;
3827 if (touchPoint.state() == QEventPoint::State::Pressed) {
3828 if (device->type() == QInputDevice::DeviceType::TouchPad) {
3831 target = QPointingDevicePrivate::get(device)->firstActiveTarget();
3834 if (target.isNull()) {
3837 window = QApplication::topLevelAt(touchPoint.globalPosition().toPoint());
3840 target = window->childAt(window->mapFromGlobal(touchPoint.globalPosition().toPoint()));
3845 bool usingClosestWidget =
false;
3846 if (device->type() == QInputDevice::DeviceType::TouchScreen) {
3847 QWidget *closestWidget = d->findClosestTouchPointTarget(device, touchPoint);
3848 QWidget *widget =
static_cast<QWidget *>(target.data());
3850 && (widget->isAncestorOf(closestWidget) || closestWidget->isAncestorOf(widget))) {
3851 target = closestWidget;
3852 usingClosestWidget =
true;
3858 if (device->type() == QInputDevice::DeviceType::TouchPad || usingClosestWidget)
3859 QMutableEventPoint::setTarget(touchPoint, target);
3861 target = QMutableEventPoint::target(touchPoint);
3865 Q_ASSERT(!target.isNull());
3867 QWidget *targetWidget =
static_cast<QWidget *>(target.data());
3872 if (touchPoints.count() == 1
3873 && device->type() == QInputDevice::DeviceType::TouchPad
3874 && !targetWidget->testAttribute(Qt::WA_TouchPadAcceptSingleTouchEvents))
3878 StatesAndTouchPoints &maskAndPoints = widgetsNeedingEvents[targetWidget];
3879 maskAndPoints.first = QEventPoint::State(maskAndPoints.first | touchPoint.state());
3880 maskAndPoints.second.append(touchPoint);
3883 if (widgetsNeedingEvents.isEmpty())
3886 bool accepted =
false;
3887 QHash<QWidget *, StatesAndTouchPoints>::ConstIterator it = widgetsNeedingEvents.constBegin();
3888 const QHash<QWidget *, StatesAndTouchPoints>::ConstIterator end = widgetsNeedingEvents.constEnd();
3889 for (; it != end; ++it) {
3890 const QPointer<QWidget> widget = it.key();
3891 if (!QApplicationPrivate::tryModalHelper(widget,
nullptr))
3894 QEvent::Type eventType;
3895 switch (it.value().first) {
3896 case QEventPoint::State::Pressed:
3897 eventType = QEvent::TouchBegin;
3899 case QEventPoint::State::Released:
3900 eventType = QEvent::TouchEnd;
3902 case QEventPoint::State::Stationary:
3906 eventType = QEvent::TouchUpdate;
3910 QMutableTouchEvent touchEvent(eventType, device, QGuiApplication::keyboardModifiers(),
3912 bool containsPress = updateTouchPointsForWidget(widget, &touchEvent);
3913 touchEvent.setTimestamp(te->timestamp());
3914 touchEvent.setTarget(widget);
3917 widget->setAttribute(Qt::WA_WState_AcceptedTouchBeginEvent);
3919 switch (touchEvent.type()) {
3920 case QEvent::TouchBegin:
3924 bool res = te->spontaneous() ? QApplication::sendSpontaneousEvent(widget, &touchEvent)
3925 : QApplication::sendEvent(widget, &touchEvent);
3926 if (res && touchEvent.isAccepted()) {
3928 if (!widget.isNull())
3929 widget->setAttribute(Qt::WA_WState_AcceptedTouchBeginEvent);
3934 if (widget->testAttribute(Qt::WA_WState_AcceptedTouchBeginEvent)
3935#ifndef QT_NO_GESTURES
3936 || QGestureManager::gesturePending(widget)
3939 bool res = te->spontaneous() ? QApplication::sendSpontaneousEvent(widget, &touchEvent)
3940 : QApplication::sendEvent(widget, &touchEvent);
3941 if (res && touchEvent.isAccepted())
3944 if (touchEvent.type() == QEvent::TouchEnd && !widget.isNull())
3945 widget->setAttribute(Qt::WA_WState_AcceptedTouchBeginEvent,
false);