diff --git a/src/quick/items/qquickwindow.cpp b/src/quick/items/qquickwindow.cpp index 3a8e177bbbf5170fb22968eab42a01165b8ec0e2..c1110905203ea8a9066ab0234ca0189605b4feb7 100644 --- a/src/quick/items/qquickwindow.cpp +++ b/src/quick/items/qquickwindow.cpp @@ -660,6 +660,7 @@ void QQuickWindowPrivate::setFocusInScope(QQuickItem *scope, QQuickItem *item, Q QQuickItemPrivate *scopePrivate = scope ? QQuickItemPrivate::get(scope) : 0; QQuickItemPrivate *itemPrivate = QQuickItemPrivate::get(item); + QQuickItem *currentActiveFocusItem = activeFocusItem; QQuickItem *newActiveFocusItem = 0; QVarLengthArray<QQuickItem *, 20> changed; @@ -736,7 +737,8 @@ void QQuickWindowPrivate::setFocusInScope(QQuickItem *scope, QQuickItem *item, Q q->sendEvent(newActiveFocusItem, &event); } - emit q->focusObjectChanged(activeFocusItem); + if (activeFocusItem != currentActiveFocusItem) + emit q->focusObjectChanged(activeFocusItem); if (!changed.isEmpty()) notifyFocusChangesRecur(changed.data(), changed.count() - 1); @@ -763,6 +765,7 @@ void QQuickWindowPrivate::clearFocusInScope(QQuickItem *scope, QQuickItem *item, return;//No focus, nothing to do. } + QQuickItem *currentActiveFocusItem = activeFocusItem; QQuickItem *oldActiveFocusItem = 0; QQuickItem *newActiveFocusItem = 0; @@ -819,7 +822,8 @@ void QQuickWindowPrivate::clearFocusInScope(QQuickItem *scope, QQuickItem *item, q->sendEvent(newActiveFocusItem, &event); } - emit q->focusObjectChanged(activeFocusItem); + if (activeFocusItem != currentActiveFocusItem) + emit q->focusObjectChanged(activeFocusItem); if (!changed.isEmpty()) notifyFocusChangesRecur(changed.data(), changed.count() - 1); diff --git a/tests/auto/quick/qquickwindow/data/focus.qml b/tests/auto/quick/qquickwindow/data/focus.qml index 899b999cdc6de303c9f720262d40883f6834a097..fa8ae9dc69244524dee535ee2169d0fa4f2d3d9a 100644 --- a/tests/auto/quick/qquickwindow/data/focus.qml +++ b/tests/auto/quick/qquickwindow/data/focus.qml @@ -12,4 +12,8 @@ Window.Window { Item { objectName: "item2" } + + FocusScope { + Item { objectName: "item3" } + } } diff --git a/tests/auto/quick/qquickwindow/tst_qquickwindow.cpp b/tests/auto/quick/qquickwindow/tst_qquickwindow.cpp index b09f80a6348e9471bb3201bc307e4775bd354a59..107d1d71f79bf5176cff8c3c3fb400be32b160c5 100644 --- a/tests/auto/quick/qquickwindow/tst_qquickwindow.cpp +++ b/tests/auto/quick/qquickwindow/tst_qquickwindow.cpp @@ -1145,20 +1145,35 @@ void tst_qquickwindow::focusObject() QQuickWindow *window = qobject_cast<QQuickWindow*>(created); QVERIFY(window); + QSignalSpy focusObjectSpy(window, SIGNAL(focusObjectChanged(QObject*))); + window->show(); QVERIFY(QTest::qWaitForWindowExposed(window)); window->requestActivate(); QVERIFY(QTest::qWaitForWindowActive(window)); + QCOMPARE(window->contentItem(), window->focusObject()); + QCOMPARE(focusObjectSpy.count(), 1); + QQuickItem *item1 = window->findChild<QQuickItem*>("item1"); QVERIFY(item1); item1->setFocus(true); QCOMPARE(item1, window->focusObject()); + QCOMPARE(focusObjectSpy.count(), 2); QQuickItem *item2 = window->findChild<QQuickItem*>("item2"); QVERIFY(item2); item2->setFocus(true); QCOMPARE(item2, window->focusObject()); + QCOMPARE(focusObjectSpy.count(), 3); + + // set focus for item in non-focused focus scope and + // ensure focusObject does not change and signal is not emitted + QQuickItem *item3 = window->findChild<QQuickItem*>("item3"); + QVERIFY(item3); + item3->setFocus(true); + QCOMPARE(item2, window->focusObject()); + QCOMPARE(focusObjectSpy.count(), 3); } void tst_qquickwindow::ignoreUnhandledMouseEvents()