diff --git a/src/quick/items/qquickwindow.cpp b/src/quick/items/qquickwindow.cpp index d6cbae7d2a175d375d8b936508e882eaa60713ac..b9713c7b6ad3c59bb436d059ec81ac309594c19f 100644 --- a/src/quick/items/qquickwindow.cpp +++ b/src/quick/items/qquickwindow.cpp @@ -407,6 +407,7 @@ QQuickWindowPrivate::QQuickWindowPrivate() , persistentSceneGraph(true) , lastWheelEventAccepted(false) , componentCompleted(true) + , lastFocusReason(Qt::OtherFocusReason) , renderTarget(0) , renderTargetId(0) , incubationController(0) @@ -710,6 +711,8 @@ void QQuickWindowPrivate::setFocusInScope(QQuickItem *scope, QQuickItem *item, Q QQuickItem *currentActiveFocusItem = activeFocusItem; QQuickItem *newActiveFocusItem = 0; + lastFocusReason = reason; + QVarLengthArray<QQuickItem *, 20> changed; // Does this change the active focus? @@ -814,6 +817,8 @@ void QQuickWindowPrivate::clearFocusInScope(QQuickItem *scope, QQuickItem *item, QQuickItem *oldActiveFocusItem = 0; QQuickItem *newActiveFocusItem = 0; + lastFocusReason = reason; + QVarLengthArray<QQuickItem *, 20> changed; Q_ASSERT(item == contentItem || item == scopePrivate->subFocusItem); diff --git a/src/quick/items/qquickwindow_p.h b/src/quick/items/qquickwindow_p.h index 218425c08c021118ff615e2789e863d59ce2319b..8faaf6489b0c9322f70d9ae3ca3d80f534ddb1e9 100644 --- a/src/quick/items/qquickwindow_p.h +++ b/src/quick/items/qquickwindow_p.h @@ -227,6 +227,8 @@ public: uint lastWheelEventAccepted : 1; bool componentCompleted : 1; + Qt::FocusReason lastFocusReason; + QOpenGLFramebufferObject *renderTarget; uint renderTargetId; QSize renderTargetSize; diff --git a/tests/auto/quick/qquickwindow/tst_qquickwindow.cpp b/tests/auto/quick/qquickwindow/tst_qquickwindow.cpp index 18b0dd51324e71f07d674b73fa0d42af5a60a482..de4067b6e57181733014407a30006ccdfb193726 100644 --- a/tests/auto/quick/qquickwindow/tst_qquickwindow.cpp +++ b/tests/auto/quick/qquickwindow/tst_qquickwindow.cpp @@ -328,6 +328,7 @@ private slots: void animationsWhileHidden(); void focusObject(); + void focusReason(); void ignoreUnhandledMouseEvents(); @@ -1253,6 +1254,33 @@ void tst_qquickwindow::focusObject() QCOMPARE(focusObjectSpy.count(), 3); } +void tst_qquickwindow::focusReason() +{ + QQuickWindow *window = new QQuickWindow; + QScopedPointer<QQuickWindow> cleanup(window); + window->resize(200, 200); + window->show(); + QVERIFY(QTest::qWaitForWindowExposed(window)); + + QQuickItem *firstItem = new QQuickItem; + firstItem->setSize(QSizeF(100, 100)); + firstItem->setParentItem(window->contentItem()); + + QQuickItem *secondItem = new QQuickItem; + secondItem->setSize(QSizeF(100, 100)); + secondItem->setParentItem(window->contentItem()); + + firstItem->forceActiveFocus(Qt::OtherFocusReason); + QCOMPARE(QQuickWindowPrivate::get(window)->lastFocusReason, Qt::OtherFocusReason); + + secondItem->forceActiveFocus(Qt::TabFocusReason); + QCOMPARE(QQuickWindowPrivate::get(window)->lastFocusReason, Qt::TabFocusReason); + + firstItem->forceActiveFocus(Qt::BacktabFocusReason); + QCOMPARE(QQuickWindowPrivate::get(window)->lastFocusReason, Qt::BacktabFocusReason); + +} + void tst_qquickwindow::ignoreUnhandledMouseEvents() { QQuickWindow *window = new QQuickWindow;