aboutsummaryrefslogtreecommitdiffstats
path: root/src/quickwidgets
diff options
context:
space:
mode:
authorEskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io>2020-09-02 08:17:20 +0200
committerEskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@qt.io>2020-09-11 08:41:29 +0200
commit791fe6e5c2d0ae3533c9aa10ffa91deae46929ee (patch)
treeeec585057ee2c4f34574004130bd7ef2cc248ae5 /src/quickwidgets
parentb48fe3d53af1be7d8d7d0bdc5a2bb4aba7894fdf (diff)
Propagate focusObjectChanged signal (second attempt)
When the focus object is updated from inside the Qt Quick scene, the signal needs to be propagated from the offscreen window to the widget's window, otherwise the input methods will not react to it. Also, we need to propagate the FocusAboutToChange event, otherwise the contents of the editor will not be committed when the focus object changes, and the input method can get into an invalid state. Fixes: QTBUG-61475 Change-Id: I44ba171c0e78ef8b2e0127cba8991f1f1cf13571 Reviewed-by: Laszlo Agocs <laszlo.agocs@qt.io> (cherry picked from commit 362f6999a52849482e73915ca37ed4b6cc9ff9aa)
Diffstat (limited to 'src/quickwidgets')
-rw-r--r--src/quickwidgets/qquickwidget.cpp13
-rw-r--r--src/quickwidgets/qquickwidget.h1
2 files changed, 14 insertions, 0 deletions
diff --git a/src/quickwidgets/qquickwidget.cpp b/src/quickwidgets/qquickwidget.cpp
index 99b55d1df5..39780f8de3 100644
--- a/src/quickwidgets/qquickwidget.cpp
+++ b/src/quickwidgets/qquickwidget.cpp
@@ -135,6 +135,7 @@ void QQuickWidgetPrivate::init(QQmlEngine* e)
QWidget::connect(offscreenWindow, SIGNAL(sceneGraphInitialized()), q, SLOT(createFramebufferObject()));
QWidget::connect(offscreenWindow, SIGNAL(sceneGraphInvalidated()), q, SLOT(destroyFramebufferObject()));
+ QWidget::connect(offscreenWindow, &QQuickWindow::focusObjectChanged, q, &QQuickWidget::propagateFocusObjectChanged);
QObject::connect(renderControl, SIGNAL(renderRequested()), q, SLOT(triggerUpdate()));
QObject::connect(renderControl, SIGNAL(sceneChanged()), q, SLOT(triggerUpdate()));
}
@@ -1499,6 +1500,9 @@ bool QQuickWidget::event(QEvent *e)
// Touch events only have local and global positions, no need to map.
return QCoreApplication::sendEvent(d->offscreenWindow, e);
+ case QEvent::FocusAboutToChange:
+ return QCoreApplication::sendEvent(d->offscreenWindow, e);
+
case QEvent::InputMethod:
return QCoreApplication::sendEvent(d->offscreenWindow->focusObject(), e);
case QEvent::InputMethodQuery:
@@ -1742,6 +1746,15 @@ void QQuickWidget::paintEvent(QPaintEvent *event)
}
}
+void QQuickWidget::propagateFocusObjectChanged(QObject *focusObject)
+{
+ Q_D(QQuickWidget);
+ if (QApplication::focusObject() != this)
+ return;
+ if (QWindow *window = d->windowHandle(QWidgetPrivate::WindowHandleMode::TopLevel))
+ emit window->focusObjectChanged(focusObject);
+}
+
QT_END_NAMESPACE
#include "moc_qquickwidget.cpp"
diff --git a/src/quickwidgets/qquickwidget.h b/src/quickwidgets/qquickwidget.h
index 1ceb7449b3..fb7e5c5760 100644
--- a/src/quickwidgets/qquickwidget.h
+++ b/src/quickwidgets/qquickwidget.h
@@ -112,6 +112,7 @@ private Q_SLOTS:
void createFramebufferObject();
void destroyFramebufferObject();
void triggerUpdate();
+ void propagateFocusObjectChanged(QObject *focusObject);
protected:
void resizeEvent(QResizeEvent *) override;