From 7c1ee572770bdac445eb6a647b6a82a7dc2da407 Mon Sep 17 00:00:00 2001 From: Paul Olav Tvete <paul.tvete@digia.com> Date: Wed, 21 May 2014 10:49:07 +0200 Subject: [PATCH] Focus event fix for QQuickWidget Relay focus in/out events to the offscreen QQuickWindow, and also make the offscreen window believe it has the focus when the render window has it. Task-number: QTBUG-39033 Change-Id: Ib50b134e635833ad3813693ca272f04607c525b8 Reviewed-by: Laszlo Agocs <laszlo.agocs@digia.com> --- src/quick/items/qquickwindow.cpp | 9 ++++++++- src/quickwidgets/qquickwidget.cpp | 14 ++++++++++++++ src/quickwidgets/qquickwidget.h | 3 +++ 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/src/quick/items/qquickwindow.cpp b/src/quick/items/qquickwindow.cpp index 6220ea2e1f..e78f9141a8 100644 --- a/src/quick/items/qquickwindow.cpp +++ b/src/quick/items/qquickwindow.cpp @@ -687,6 +687,13 @@ void QQuickWindowPrivate::translateTouchEvent(QTouchEvent *touchEvent) touchEvent->setTouchPoints(touchPoints); } + +static inline bool windowHasFocus(QQuickWindow *win) +{ + const QWindow *focusWindow = QGuiApplication::focusWindow(); + return win == focusWindow || QQuickRenderControl::renderWindowFor(win) == focusWindow; +} + /*! Set the focus inside \a scope to be \a item. If the scope contains the active focus item, it will be changed to \a item. @@ -762,7 +769,7 @@ void QQuickWindowPrivate::setFocusInScope(QQuickItem *scope, QQuickItem *item, Q } if (!(options & DontChangeFocusProperty)) { - if (item != contentItem || QGuiApplication::focusWindow() == q) { + if (item != contentItem || windowHasFocus(q)) { itemPrivate->focus = true; changed << item; } diff --git a/src/quickwidgets/qquickwidget.cpp b/src/quickwidgets/qquickwidget.cpp index e20e5f22ab..7e31c271f4 100644 --- a/src/quickwidgets/qquickwidget.cpp +++ b/src/quickwidgets/qquickwidget.cpp @@ -941,6 +941,20 @@ void QQuickWidget::wheelEvent(QWheelEvent *e) } #endif + +void QQuickWidget::focusInEvent(QFocusEvent * event) +{ + Q_D(QQuickWidget); + d->offscreenWindow->focusInEvent(event); +} + +void QQuickWidget::focusOutEvent(QFocusEvent * event) +{ + Q_D(QQuickWidget); + d->offscreenWindow->focusOutEvent(event); +} + + /*! \reimp */ bool QQuickWidget::event(QEvent *e) { diff --git a/src/quickwidgets/qquickwidget.h b/src/quickwidgets/qquickwidget.h index 81e9af02fb..4287933063 100644 --- a/src/quickwidgets/qquickwidget.h +++ b/src/quickwidgets/qquickwidget.h @@ -120,6 +120,9 @@ protected: virtual void showEvent(QShowEvent *); virtual void hideEvent(QHideEvent *); + virtual void focusInEvent(QFocusEvent * event); + virtual void focusOutEvent(QFocusEvent * event); + #ifndef QT_NO_WHEELEVENT virtual void wheelEvent(QWheelEvent *); #endif -- GitLab