diff options
author | Andrew den Exter <andrew.den.exter@jollamobile.com> | 2012-12-03 17:03:02 +1000 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2012-12-04 01:50:02 +0100 |
commit | ab97a44b6ae5cc826460f3704669383afd398594 (patch) | |
tree | 608c90a557c98525fbc136c8abcf1f8a7c5fa88d /src/widgets | |
parent | 5ede8ee80d4dc637febe49e7a7a90d9fe5fc7e69 (diff) |
Clear focus of GraphicsItem focus scopes and their children.
A focus scope has effective focus if one of its children is the focus item,
clearFocus() should remove effective focus from an item and its children
not just from the focus item.
Task-number: QTBUG-28328
Change-Id: I62a292eff000151e50b2f5221e22f326a380fc3a
Reviewed-by: Martin Jones <martin.jones@jollamobile.com>
Diffstat (limited to 'src/widgets')
-rw-r--r-- | src/widgets/graphicsview/qgraphicsitem.cpp | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/src/widgets/graphicsview/qgraphicsitem.cpp b/src/widgets/graphicsview/qgraphicsitem.cpp index c30435e56a..f9b8cb83da 100644 --- a/src/widgets/graphicsview/qgraphicsitem.cpp +++ b/src/widgets/graphicsview/qgraphicsitem.cpp @@ -3313,6 +3313,12 @@ void QGraphicsItem::clearFocus() */ void QGraphicsItemPrivate::clearFocusHelper(bool giveFocusToParent, bool hiddenByParentPanel) { + QGraphicsItem *subFocusItem = q_ptr; + if (flags & QGraphicsItem::ItemIsFocusScope) { + while (subFocusItem->d_ptr->focusScopeItem) + subFocusItem = subFocusItem->d_ptr->focusScopeItem; + } + if (giveFocusToParent) { // Pass focus to the closest parent focus scope if (!inDestructor) { @@ -3321,10 +3327,10 @@ void QGraphicsItemPrivate::clearFocusHelper(bool giveFocusToParent, bool hiddenB if (p->flags() & QGraphicsItem::ItemIsFocusScope) { if (p->d_ptr->focusScopeItem == q_ptr) { p->d_ptr->focusScopeItem = 0; - if (!q_ptr->hasFocus()) //if it has focus, focusScopeItemChange is called elsewhere + if (!subFocusItem->hasFocus()) //if it has focus, focusScopeItemChange is called elsewhere focusScopeItemChange(false); } - if (q_ptr->hasFocus()) + if (subFocusItem->hasFocus()) p->d_ptr->setFocusHelper(Qt::OtherFocusReason, /* climb = */ false, /* focusFromHide = */ false); return; @@ -3334,7 +3340,7 @@ void QGraphicsItemPrivate::clearFocusHelper(bool giveFocusToParent, bool hiddenB } } - if (q_ptr->hasFocus()) { + if (subFocusItem->hasFocus()) { // Invisible items with focus must explicitly clear subfocus. if (!hiddenByParentPanel) clearSubFocus(q_ptr); |