From e260e1bcaef123c8250f019b197da10c353eff33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tor=20Arne=20Vestb=C3=B8?= Date: Thu, 16 Oct 2014 11:31:45 +0200 Subject: [PATCH] Always report focusObjectChanged on QWidget::clearFocus() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The focusObject() of a QWidgetWindow is based on the focusWidget() of the top level widget of the window, which is resolved through the focus_child chain of the widget. This is not the same thing as the focusWidget of the application. The hasFocus() function of a QWidget queries the latter, so we can't put the focusObjectChanged signal inside hasFocus() when we unconditionally clear the focus_child chain (and hence the focusObject) earlier in the function. Change-Id: Iae39da5d6031d22b21e9dc9f18e5fe6e6fd11a5c Reviewed-by: Jan Arve Sæther --- src/widgets/kernel/qwidget.cpp | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/src/widgets/kernel/qwidget.cpp b/src/widgets/kernel/qwidget.cpp index e7d33d3bd8f..5529f8f72c7 100644 --- a/src/widgets/kernel/qwidget.cpp +++ b/src/widgets/kernel/qwidget.cpp @@ -6545,10 +6545,15 @@ void QWidget::clearFocus() QWidget *w = this; while (w) { + // Just like setFocus(), we update (clear) the focus_child of our parents if (w->d_func()->focus_child == this) w->d_func()->focus_child = 0; w = w->parentWidget(); } + // Since focus_child is the basis for the top level QWidgetWindow's focusObject() + // we need to report this change to the rest of Qt, but we match setFocus() and + // do it at the end of the function. + #ifndef QT_NO_GRAPHICSVIEW QWExtra *topData = d_func()->extra; if (topData && topData->proxyWidget) @@ -6569,11 +6574,15 @@ void QWidget::clearFocus() QAccessible::updateAccessibility(&event); #endif } + } - if (QTLWExtra *extra = window()->d_func()->maybeTopData()) { - if (extra->window) - emit extra->window->focusObjectChanged(extra->window->focusObject()); - } + // Since we've unconditionally cleared the focus_child of our parents, we need + // to report this to the rest of Qt. Note that the focus_child is not the same + // thing as the application's focusWidget, which is why this piece of code is + // not inside the hasFocus() block above. + if (QTLWExtra *extra = window()->d_func()->maybeTopData()) { + if (extra->window) + emit extra->window->focusObjectChanged(extra->window->focusObject()); } }