diff options
Diffstat (limited to 'src/widgets')
-rw-r--r-- | src/widgets/graphicsview/qgraphicsproxywidget.cpp | 8 | ||||
-rw-r--r-- | src/widgets/kernel/qapplication.cpp | 40 | ||||
-rw-r--r-- | src/widgets/kernel/qapplication_p.h | 2 | ||||
-rw-r--r-- | src/widgets/kernel/qapplication_qpa.cpp | 3 | ||||
-rw-r--r-- | src/widgets/kernel/qwidget.cpp | 2 | ||||
-rw-r--r-- | src/widgets/kernel/qwidgetwindow.cpp | 6 |
6 files changed, 36 insertions, 25 deletions
diff --git a/src/widgets/graphicsview/qgraphicsproxywidget.cpp b/src/widgets/graphicsview/qgraphicsproxywidget.cpp index 762f93f55b..289f9919ef 100644 --- a/src/widgets/graphicsview/qgraphicsproxywidget.cpp +++ b/src/widgets/graphicsview/qgraphicsproxywidget.cpp @@ -267,7 +267,7 @@ void QGraphicsProxyWidgetPrivate::sendWidgetMouseEvent(QGraphicsSceneMouseEvent } if (!lastWidgetUnderMouse) { - QApplicationPrivate::dispatchEnterLeave(embeddedMouseGrabber ? embeddedMouseGrabber : receiver, 0); + QApplicationPrivate::dispatchEnterLeave(embeddedMouseGrabber ? embeddedMouseGrabber : receiver, 0, event->screenPos()); lastWidgetUnderMouse = receiver; } @@ -293,7 +293,7 @@ void QGraphicsProxyWidgetPrivate::sendWidgetMouseEvent(QGraphicsSceneMouseEvent else // released on the frame our outside the item, or doesn't accept hover events. lastWidgetUnderMouse = 0; - QApplicationPrivate::dispatchEnterLeave(lastWidgetUnderMouse, embeddedMouseGrabber); + QApplicationPrivate::dispatchEnterLeave(lastWidgetUnderMouse, embeddedMouseGrabber, event->screenPos()); embeddedMouseGrabber = 0; #ifndef QT_NO_CURSOR @@ -1142,7 +1142,7 @@ void QGraphicsProxyWidget::hoverLeaveEvent(QGraphicsSceneHoverEvent *event) Q_D(QGraphicsProxyWidget); // If hoverMove was compressed away, make sure we update properly here. if (d->lastWidgetUnderMouse) { - QApplicationPrivate::dispatchEnterLeave(0, d->lastWidgetUnderMouse); + QApplicationPrivate::dispatchEnterLeave(0, d->lastWidgetUnderMouse, event->screenPos()); d->lastWidgetUnderMouse = 0; } } @@ -1159,7 +1159,7 @@ void QGraphicsProxyWidget::hoverMoveEvent(QGraphicsSceneHoverEvent *event) // Ignore events on the window frame. if (!d->widget || !rect().contains(event->pos())) { if (d->lastWidgetUnderMouse) { - QApplicationPrivate::dispatchEnterLeave(0, d->lastWidgetUnderMouse); + QApplicationPrivate::dispatchEnterLeave(0, d->lastWidgetUnderMouse, event->screenPos()); d->lastWidgetUnderMouse = 0; } return; diff --git a/src/widgets/kernel/qapplication.cpp b/src/widgets/kernel/qapplication.cpp index aeceba1886..d62b8ef146 100644 --- a/src/widgets/kernel/qapplication.cpp +++ b/src/widgets/kernel/qapplication.cpp @@ -2114,20 +2114,23 @@ QWidget *QApplicationPrivate::focusNextPrevChild_helper(QWidget *toplevel, bool } /*! - \fn void QApplicationPrivate::dispatchEnterLeave(QWidget* enter, QWidget* leave) + \fn void QApplicationPrivate::dispatchEnterLeave(QWidget* enter, QWidget* leave, const QPointF &globalPosF) \internal Creates the proper Enter/Leave event when widget \a enter is entered and widget \a leave is left. */ -void QApplicationPrivate::dispatchEnterLeave(QWidget* enter, QWidget* leave) { +void QApplicationPrivate::dispatchEnterLeave(QWidget* enter, QWidget* leave, const QPointF &globalPosF) +{ + const QPoint globalPos = globalPosF.toPoint(); #if 0 if (leave) { QEvent e(QEvent::Leave); QApplication::sendEvent(leave, & e); } if (enter) { - QEvent e(QEvent::Enter); + const QPoint windowPos = enter->window()->mapFromGlobal(globalPos); + QEnterEvent e(enter->mapFromGlobal(globalPos), windowPos, globalPos); QApplication::sendEvent(enter, & e); } return; @@ -2205,17 +2208,20 @@ void QApplicationPrivate::dispatchEnterLeave(QWidget* enter, QWidget* leave) { } } } - QPoint posEnter = QCursor::pos(); - QEvent enterEvent(QEvent::Enter); - for (int i = 0; i < enterList.size(); ++i) { - w = enterList.at(i); - if (!QApplication::activeModalWidget() || QApplicationPrivate::tryModalHelper(w, 0)) { - QApplication::sendEvent(w, &enterEvent); - if (w->testAttribute(Qt::WA_Hover) && - (!QApplication::activePopupWidget() || QApplication::activePopupWidget() == w->window())) { - QHoverEvent he(QEvent::HoverEnter, w->mapFromGlobal(posEnter), QPoint(-1, -1), - QApplication::keyboardModifiers()); - qApp->d_func()->notify_helper(w, &he); + if (!enterList.isEmpty()) { + const QPoint windowPos = enterList.front()->window()->mapFromGlobal(globalPos); + for (int i = 0; i < enterList.size(); ++i) { + w = enterList.at(i); + if (!QApplication::activeModalWidget() || QApplicationPrivate::tryModalHelper(w, 0)) { + const QPointF localPos = w->mapFromGlobal(globalPos); + QEnterEvent enterEvent(localPos, windowPos, globalPosF); + QApplication::sendEvent(w, &enterEvent); + if (w->testAttribute(Qt::WA_Hover) && + (!QApplication::activePopupWidget() || QApplication::activePopupWidget() == w->window())) { + QHoverEvent he(QEvent::HoverEnter, localPos, QPoint(-1, -1), + QApplication::keyboardModifiers()); + qApp->d_func()->notify_helper(w, &he); + } } } } @@ -2506,9 +2512,9 @@ bool QApplicationPrivate::sendMouseEvent(QWidget *receiver, QMouseEvent *event, || (isAlien(lastMouseReceiver) && !alienWidget)) { if (activePopupWidget) { if (!QWidget::mouseGrabber()) - dispatchEnterLeave(alienWidget ? alienWidget : nativeWidget, lastMouseReceiver); + dispatchEnterLeave(alienWidget ? alienWidget : nativeWidget, lastMouseReceiver, event->screenPos()); } else { - dispatchEnterLeave(receiver, lastMouseReceiver); + dispatchEnterLeave(receiver, lastMouseReceiver, event->screenPos()); } } @@ -2540,7 +2546,7 @@ bool QApplicationPrivate::sendMouseEvent(QWidget *receiver, QMouseEvent *event, enter = alienGuard ? alienWidget : nativeWidget; else // The receiver is typically deleted on mouse release with drag'n'drop. enter = QApplication::widgetAt(event->globalPos()); - dispatchEnterLeave(enter, leaveAfterRelease); + dispatchEnterLeave(enter, leaveAfterRelease, event->screenPos()); leaveAfterRelease = 0; lastMouseReceiver = enter; } else if (!wasLeaveAfterRelease) { diff --git a/src/widgets/kernel/qapplication_p.h b/src/widgets/kernel/qapplication_p.h index 5682d794cf..5b3493f478 100644 --- a/src/widgets/kernel/qapplication_p.h +++ b/src/widgets/kernel/qapplication_p.h @@ -135,7 +135,7 @@ public: void createEventDispatcher(); - static void dispatchEnterLeave(QWidget *enter, QWidget *leave); + static void dispatchEnterLeave(QWidget *enter, QWidget *leave, const QPointF &globalPosF); //modality bool isWindowBlocked(QWindow *window, QWindow **blockingWindow = 0) const Q_DECL_OVERRIDE; diff --git a/src/widgets/kernel/qapplication_qpa.cpp b/src/widgets/kernel/qapplication_qpa.cpp index 5dc68e47e0..e8db364473 100644 --- a/src/widgets/kernel/qapplication_qpa.cpp +++ b/src/widgets/kernel/qapplication_qpa.cpp @@ -253,7 +253,8 @@ void QApplicationPrivate::openPopup(QWidget *popup) // Dispatch leave for last mouse receiver to update undermouse states if (qt_last_mouse_receiver && !QWidget::mouseGrabber()) { - QApplicationPrivate::dispatchEnterLeave(0, qt_last_mouse_receiver.data()); + QApplicationPrivate::dispatchEnterLeave(0, qt_last_mouse_receiver.data(), + QGuiApplicationPrivate::lastCursorPosition); qt_last_mouse_receiver = 0; } } diff --git a/src/widgets/kernel/qwidget.cpp b/src/widgets/kernel/qwidget.cpp index 2feb797985..be2a5f36cd 100644 --- a/src/widgets/kernel/qwidget.cpp +++ b/src/widgets/kernel/qwidget.cpp @@ -8563,6 +8563,8 @@ void QWidget::enterEvent(QEvent *) { } +// ### Qt 6: void QWidget::enterEvent(QEnterEvent *). + /*! \fn void QWidget::leaveEvent(QEvent *event) diff --git a/src/widgets/kernel/qwidgetwindow.cpp b/src/widgets/kernel/qwidgetwindow.cpp index 1cabb095ec..c11e36312f 100644 --- a/src/widgets/kernel/qwidgetwindow.cpp +++ b/src/widgets/kernel/qwidgetwindow.cpp @@ -230,6 +230,7 @@ void QWidgetWindow::handleEnterLeaveEvent(QEvent *event) QWindowSystemInterfacePrivate::EnterEvent *systemEvent = static_cast<QWindowSystemInterfacePrivate::EnterEvent *> (QWindowSystemInterfacePrivate::peekWindowSystemEvent(QWindowSystemInterfacePrivate::Enter)); + const QPointF globalPosF = systemEvent ? systemEvent->globalPos : QGuiApplicationPrivate::lastCursorPosition; if (systemEvent) { if (QWidgetWindow *enterWindow = qobject_cast<QWidgetWindow *>(systemEvent->enter)) { @@ -255,11 +256,12 @@ void QWidgetWindow::handleEnterLeaveEvent(QEvent *event) QWidget *leave = m_widget; if (qt_last_mouse_receiver && !qt_last_mouse_receiver->internalWinId()) leave = qt_last_mouse_receiver.data(); - QApplicationPrivate::dispatchEnterLeave(enter, leave); + QApplicationPrivate::dispatchEnterLeave(enter, leave, globalPosF); qt_last_mouse_receiver = enter; } } else { - QApplicationPrivate::dispatchEnterLeave(m_widget, 0); + const QEnterEvent *ee = static_cast<QEnterEvent *>(event); + QApplicationPrivate::dispatchEnterLeave(m_widget, 0, ee->screenPos()); qt_last_mouse_receiver = m_widget; } } |