diff options
author | Denis Dzyubenko <denis.dzyubenko@nokia.com> | 2009-06-02 12:59:17 (GMT) |
---|---|---|
committer | Denis Dzyubenko <denis.dzyubenko@nokia.com> | 2009-06-02 14:19:04 (GMT) |
commit | 1a7da7096bbda17197738061902f4489af234bc0 (patch) | |
tree | db11d318edda713149ae67e1a4886da8dec51ac2 /src/gui/kernel/qwidget.cpp | |
parent | 3be8bd20537ea215c7accaf1be3ffb6673fd897b (diff) | |
download | Qt-1a7da7096bbda17197738061902f4489af234bc0.zip Qt-1a7da7096bbda17197738061902f4489af234bc0.tar.gz Qt-1a7da7096bbda17197738061902f4489af234bc0.tar.bz2 |
Setting a focus on a widget hierarchy which contains both visible and
invisible widgets could cause a crash.
Also, when there is a widget hierarchy A->B->C and A and C are marked
as visible but B is hidden, when the user gives focus explicitely to
C, we should remember that and respect it when B becomes visible.
Task-number: 254563
Reviewed-by: Thierry Bastian
Diffstat (limited to 'src/gui/kernel/qwidget.cpp')
-rw-r--r-- | src/gui/kernel/qwidget.cpp | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/src/gui/kernel/qwidget.cpp b/src/gui/kernel/qwidget.cpp index 5538c11..d436ffb 100644 --- a/src/gui/kernel/qwidget.cpp +++ b/src/gui/kernel/qwidget.cpp @@ -5674,10 +5674,15 @@ void QWidget::setFocus(Qt::FocusReason reason) w = w->isWindow() ? 0 : w->parentWidget(); } } else { - while (w) { + while (w && w->isVisible()) { w->d_func()->focus_child = f; w = w->isWindow() ? 0 : w->parentWidget(); } + // a special case, if there is an invisible parent, notify him + // about the focus_child widget, so that if it becomes + // visible, the focus widget will be respected. + if (w) + w->d_func()->focus_child = f; } #ifndef QT_NO_GRAPHICSVIEW @@ -6729,6 +6734,10 @@ void QWidgetPrivate::show_helper() if (QApplicationPrivate::hidden_focus_widget == q) { QApplicationPrivate::hidden_focus_widget = 0; q->setFocus(Qt::OtherFocusReason); + } else if (focus_child) { + // if we are shown and there is an explicit focus child widget + // set, respect it by giving him focus. + focus_child->setFocus(Qt::OtherFocusReason); } // Process events when showing a Qt::SplashScreen widget before the event loop |