From 2e24488fb16b67a387f58668a8cfe66b04081d40 Mon Sep 17 00:00:00 2001 From: Berthold Krevert Date: Fri, 2 May 2014 15:18:25 +0200 Subject: Notify about the focus reason KeyNavigation sets the focus reason always to Qt::OtherFocusReason. This should be changed at least for tab and backtab navigation. Change-Id: I27c654a202e2a80449dd5420460e413ca9cff75e Reviewed-by: J-P Nurmi Reviewed-by: Liang Qi --- tests/auto/quick/qquickitem2/tst_qquickitem.cpp | 72 +++++++++++++++++++++++++ 1 file changed, 72 insertions(+) (limited to 'tests/auto/quick/qquickitem2/tst_qquickitem.cpp') diff --git a/tests/auto/quick/qquickitem2/tst_qquickitem.cpp b/tests/auto/quick/qquickitem2/tst_qquickitem.cpp index 2de7fa1a83..10f4aa2c83 100644 --- a/tests/auto/quick/qquickitem2/tst_qquickitem.cpp +++ b/tests/auto/quick/qquickitem2/tst_qquickitem.cpp @@ -88,6 +88,7 @@ private slots: void keyNavigation_RightToLeft(); void keyNavigation_skipNotVisible(); void keyNavigation_implicitSetting(); + void keyNavigation_focusReason(); void layoutMirroring(); void layoutMirroringIllegalParent(); void smooth(); @@ -214,6 +215,21 @@ public: int mKey; }; +class FocusEventFilter : public QObject +{ +protected: + bool eventFilter(QObject *watched, QEvent *event) { + if ((event->type() == QEvent::FocusIn) || (event->type() == QEvent::FocusOut)) { + QFocusEvent *focusEvent = static_cast(event); + lastFocusReason = focusEvent->reason(); + return false; + } else + return QObject::eventFilter(watched, event); + } +public: + Qt::FocusReason lastFocusReason; +}; + QML_DECLARE_TYPE(KeyTestItem); class HollowTestItem : public QQuickItem @@ -1754,6 +1770,62 @@ void tst_QQuickItem::keyNavigation_implicitSetting() delete window; } +void tst_QQuickItem::keyNavigation_focusReason() +{ + QQuickView *window = new QQuickView(0); + window->setBaseSize(QSize(240,320)); + + FocusEventFilter focusEventFilter; + + window->setSource(testFileUrl("keynavigationtest.qml")); + window->show(); + window->requestActivate(); + + QVERIFY(QTest::qWaitForWindowActive(window)); + QVERIFY(QGuiApplication::focusWindow() == window); + + // install event filter on first item + QQuickItem *item = findItem(window->rootObject(), "item1"); + QVERIFY(item); + QVERIFY(item->hasActiveFocus()); + item->installEventFilter(&focusEventFilter); + + //install event filter on second item + item = findItem(window->rootObject(), "item2"); + QVERIFY(item); + item->installEventFilter(&focusEventFilter); + + //install event filter on third item + item = findItem(window->rootObject(), "item3"); + QVERIFY(item); + item->installEventFilter(&focusEventFilter); + + //install event filter on last item + item = findItem(window->rootObject(), "item4"); + QVERIFY(item); + item->installEventFilter(&focusEventFilter); + + // tab + QKeyEvent key = QKeyEvent(QEvent::KeyPress, Qt::Key_Tab, Qt::NoModifier, "", false, 1); + QGuiApplication::sendEvent(window, &key); + QVERIFY(key.isAccepted()); + QCOMPARE(focusEventFilter.lastFocusReason, Qt::TabFocusReason); + + // backtab + key = QKeyEvent(QEvent::KeyPress, Qt::Key_Backtab, Qt::NoModifier, "", false, 1); + QGuiApplication::sendEvent(window, &key); + QVERIFY(key.isAccepted()); + QCOMPARE(focusEventFilter.lastFocusReason, Qt::BacktabFocusReason); + + // some arbitrary cursor key + key = QKeyEvent(QEvent::KeyPress, Qt::Key_Right, Qt::NoModifier, "", false, 1); + QGuiApplication::sendEvent(window, &key); + QVERIFY(key.isAccepted()); + QCOMPARE(focusEventFilter.lastFocusReason, Qt::OtherFocusReason); + + delete window; +} + void tst_QQuickItem::smooth() { QQmlComponent component(&engine); -- cgit v1.2.3