Skip to content

Commit 48da34f

Browse files
committed
QQuickOverlay: Handle hover events
With recent changes to hover handling logic, hover events would have been sent to the "main window", even if a popup were modal. As this is unwanted (a modally blocked button should not auto-raise when hovered), we now prevent delivery of those events in QQuickOverlay and overlayEvent. The logic is the same as for mouse and touch events: If we get a matching event, we ask the popup to handle it. The popup then uses the existing blockInput logic to decide whether the event should be blocked or forwarded. Pick-to: 6.2 Change-Id: I2194fd8e832592efd5b7b9697412bdaeaea74b83 Reviewed-by: Shawn Rutledge <[email protected]> Reviewed-by: Andrei Golubev <[email protected]>
1 parent 6363bc8 commit 48da34f

File tree

4 files changed

+39
-0
lines changed

4 files changed

+39
-0
lines changed

src/quicktemplates2/qquickoverlay.cpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,22 @@ bool QQuickOverlayPrivate::handleMouseEvent(QQuickItem *source, QMouseEvent *eve
207207
return false;
208208
}
209209

210+
bool QQuickOverlayPrivate::handleHoverEvent(QQuickItem *source, QHoverEvent *event, QQuickPopup *target)
211+
{
212+
switch (event->type()) {
213+
case QEvent::HoverEnter:
214+
case QEvent::HoverMove:
215+
case QEvent::HoverLeave:
216+
if (target)
217+
return target->overlayEvent(source, event);
218+
return false;
219+
default:
220+
Q_UNREACHABLE(); // function must only be called on hover events
221+
break;
222+
}
223+
return false;
224+
}
225+
210226
#if QT_CONFIG(quicktemplates2_multitouch)
211227
bool QQuickOverlayPrivate::handleTouchEvent(QQuickItem *source, QTouchEvent *event, QQuickPopup *target)
212228
{
@@ -474,6 +490,10 @@ bool QQuickOverlay::childMouseEventFilter(QQuickItem *item, QEvent *event)
474490
case QEvent::TouchEnd:
475491
return d->handleTouchEvent(item, static_cast<QTouchEvent *>(event), popup);
476492
#endif
493+
case QEvent::HoverEnter:
494+
case QEvent::HoverMove:
495+
case QEvent::HoverLeave:
496+
return d->handleHoverEvent(item, static_cast<QHoverEvent *>(event), popup);
477497

478498
case QEvent::MouseButtonPress:
479499
case QEvent::MouseMove:

src/quicktemplates2/qquickoverlay_p_p.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ class QQuickOverlayPrivate : public QQuickItemPrivate, public QQuickItemChangeLi
7474
bool handleRelease(QQuickItem *source, QEvent *event, QQuickPopup *target);
7575

7676
bool handleMouseEvent(QQuickItem *source, QMouseEvent *event, QQuickPopup *target = nullptr);
77+
bool handleHoverEvent(QQuickItem *source, QHoverEvent *event, QQuickPopup *target = nullptr);
7778
#if QT_CONFIG(quicktemplates2_multitouch)
7879
bool handleTouchEvent(QQuickItem *source, QTouchEvent *event, QQuickPopup *target = nullptr);
7980
#endif

src/quicktemplates2/qquickpopup.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -412,6 +412,19 @@ bool QQuickPopupPrivate::handleMouseEvent(QQuickItem *item, QMouseEvent *event)
412412
}
413413
}
414414

415+
bool QQuickPopupPrivate::handleHoverEvent(QQuickItem *item, QHoverEvent *event)
416+
{
417+
switch (event->type()) {
418+
case QEvent::HoverEnter:
419+
case QEvent::HoverMove:
420+
case QEvent::HoverLeave:
421+
return blockInput(item, event->scenePosition());
422+
default:
423+
Q_UNREACHABLE();
424+
return false;
425+
}
426+
}
427+
415428
#if QT_CONFIG(quicktemplates2_multitouch)
416429
bool QQuickPopupPrivate::handleTouchEvent(QQuickItem *item, QTouchEvent *event)
417430
{
@@ -2558,6 +2571,10 @@ bool QQuickPopup::overlayEvent(QQuickItem *item, QEvent *event)
25582571
case QEvent::TouchEnd:
25592572
return d->handleTouchEvent(item, static_cast<QTouchEvent *>(event));
25602573
#endif
2574+
case QEvent::HoverEnter:
2575+
case QEvent::HoverMove:
2576+
case QEvent::HoverLeave:
2577+
return d->handleHoverEvent(item, static_cast<QHoverEvent *>(event));
25612578

25622579
case QEvent::MouseButtonPress:
25632580
case QEvent::MouseButtonRelease:

src/quicktemplates2/qquickpopup_p_p.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,7 @@ class Q_QUICKTEMPLATES2_PRIVATE_EXPORT QQuickPopupPrivate
120120
virtual void handleUngrab();
121121

122122
bool handleMouseEvent(QQuickItem *item, QMouseEvent *event);
123+
bool handleHoverEvent(QQuickItem *item, QHoverEvent *event);
123124
#if QT_CONFIG(quicktemplates2_multitouch)
124125
bool handleTouchEvent(QQuickItem *item, QTouchEvent *event);
125126
#endif

0 commit comments

Comments
 (0)