diff options
author | Liang Qi <liang.qi@theqtcompany.com> | 2015-09-17 16:39:40 +0200 |
---|---|---|
committer | Liang Qi <liang.qi@theqtcompany.com> | 2015-09-17 15:54:32 +0000 |
commit | b3c812cfcf435364f6d365f65597e11969dbf7a2 (patch) | |
tree | dcf28f6511ed9431734f70dc2342678a51a68be9 /tests/auto/activeFocusOnTab | |
parent | 7c5c9d1fb8bff09d955489f65098f3f63c53bef5 (diff) |
Templates: fix activeFocusOnTab
Autotest is included, except ScrollBar and StackView.
Change-Id: Idfbf031451ff3b244cd7f538c7210f0c242482ac
Reviewed-by: J-P Nurmi <jpnurmi@theqtcompany.com>
Diffstat (limited to 'tests/auto/activeFocusOnTab')
-rw-r--r-- | tests/auto/activeFocusOnTab/activeFocusOnTab.pro | 13 | ||||
-rw-r--r-- | tests/auto/activeFocusOnTab/data/activeFocusOnTab.qml | 187 | ||||
-rw-r--r-- | tests/auto/activeFocusOnTab/tst_activeFocusOnTab.cpp | 445 |
3 files changed, 645 insertions, 0 deletions
diff --git a/tests/auto/activeFocusOnTab/activeFocusOnTab.pro b/tests/auto/activeFocusOnTab/activeFocusOnTab.pro new file mode 100644 index 00000000..7bc510e5 --- /dev/null +++ b/tests/auto/activeFocusOnTab/activeFocusOnTab.pro @@ -0,0 +1,13 @@ +CONFIG += testcase +TARGET = tst_activeFocusOnTab +osx:CONFIG -= app_bundle + +SOURCES += tst_activeFocusOnTab.cpp + +include (../shared/util.pri) + +TESTDATA = data/* + +QT += core-private gui-private qml-private quick-private testlib +!no_desktop: QT += widgets +DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0 diff --git a/tests/auto/activeFocusOnTab/data/activeFocusOnTab.qml b/tests/auto/activeFocusOnTab/data/activeFocusOnTab.qml new file mode 100644 index 00000000..92a90127 --- /dev/null +++ b/tests/auto/activeFocusOnTab/data/activeFocusOnTab.qml @@ -0,0 +1,187 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** You may use this file under the terms of the BSD license as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +import QtQuick 2.5 +import QtQuick.Layouts 1.2 +import QtQuick.Controls 2.0 + +Item { + id: main + objectName: "main" + width: 400 + height: 800 + focus: true + Component.onCompleted: button1.focus = true + Column { + anchors.fill: parent + id: column + objectName: "column" + BusyIndicator { + id: busyindicator + objectName: "busyindicator" + } + Button { + id: button1 + objectName: "button1" + text: "button1" + } + Button { + id: button2 + objectName: "button2" + text: "button2" + } + CheckBox { + id: checkbox + objectName: "checkbox" + text: "checkbox" + } + GroupBox { + id: groupbox1 + objectName: "groupbox1" + title: "grouppox1" + ColumnLayout { + anchors.fill: parent + CheckBox { + id: checkbox1 + objectName: "checkbox1" + text: "checkbox1" + } + CheckBox { + id: checkbox2 + objectName: "checkbox2" + text: "checkbox2" + } + } + } + Label { + id: label + objectName: "label" + text: "label" + } + PageIndicator { + id: pageindicator + objectName: "pageindicator" + } + ProgressBar { + id: progressbar + objectName: "progressbar" + indeterminate: true + } + RadioButton { + id: radiobutton + objectName: "radiobutton" + text: "radiobutton" + } + GroupBox { + id: groupbox2 + objectName: "groupbox2" + title: "groupbox2" + ColumnLayout { + anchors.fill: parent + RadioButton { + id: radiobutton1 + objectName: "radiobutton1" + text: "radiobutton1" + } + RadioButton { + id: radiobutton2 + objectName: "radiobutton2" + text: "radiobutton2" + } + } + } + // ScrollBar + ScrollIndicator { + id: scrollindicator + objectName: "scrollindicator" + } + Slider { + id: slider + objectName: "slider" + value: 0.5 + } + // StackView + Switch { + id: swtich // switch + objectName: "switch" + text: "switch" + } + TabBar { + width: parent.width + id: tabbar + objectName: "tabbar" + TabButton { + id: tabbutton1 + objectName: "tabbutton1" + text: "tabbutton1" + } + TabButton { + id: tabbutton2 + objectName: "tabbutton2" + text: "tabbutton2" + } + } + TextField { + id: textfield + objectName: "textfield" + text: "abc" + } + ToggleButton { + id: togglebutton + objectName: "togglebutton" + text: "togglebutton" + } + ToolBar { + width: parent.width + id: toolbar + objectName: "toolbar" + ToolButton { + id: toolbutton + objectName: "toolbutton" + text: "toolbutton" + } + } + TextArea { + id: textarea + objectName: "textarea" + text: "abc" + } + } +} diff --git a/tests/auto/activeFocusOnTab/tst_activeFocusOnTab.cpp b/tests/auto/activeFocusOnTab/tst_activeFocusOnTab.cpp new file mode 100644 index 00000000..8ac756b9 --- /dev/null +++ b/tests/auto/activeFocusOnTab/tst_activeFocusOnTab.cpp @@ -0,0 +1,445 @@ +/**************************************************************************** +** +** Copyright (C) 2015 The Qt Company Ltd. +** Contact: http://www.qt.io/licensing/ +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL3$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see http://www.qt.io/terms-conditions. For further +** information use the contact form at http://www.qt.io/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPLv3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or later as published by the Free +** Software Foundation and appearing in the file LICENSE.GPL included in +** the packaging of this file. Please review the following information to +** ensure the GNU General Public License version 2.0 requirements will be +** met: http://www.gnu.org/licenses/gpl-2.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <qtest.h> +#include <QtTest/QSignalSpy> +#include <QtQml/qqmlengine.h> +#include <QtQml/qqmlcomponent.h> +#include <QtQml/qqmlcontext.h> +#include <QtQuick/qquickview.h> +#include <QtQuick/private/qquickitem_p.h> +#include <QtGui/private/qguiapplication_p.h> +#include <QtGui/qstylehints.h> +#include "../shared/util.h" +#include "../shared/visualtestutil.h" + +using namespace QQuickVisualTestUtil; + +class tst_activeFocusOnTab : public QQmlDataTest +{ + Q_OBJECT +public: + tst_activeFocusOnTab(); + +private slots: + void initTestCase(); + void cleanup(); + + void activeFocusOnTab(); + void activeFocusOnTab2(); +private: + QQmlEngine engine; + bool qt_tab_all_widgets() { + return QGuiApplication::styleHints()->tabFocusBehavior() == Qt::TabFocusAllControls; + } +}; + +tst_activeFocusOnTab::tst_activeFocusOnTab() +{ +} + +void tst_activeFocusOnTab::initTestCase() +{ + QQmlDataTest::initTestCase(); +} + +void tst_activeFocusOnTab::cleanup() +{ +} + +void tst_activeFocusOnTab::activeFocusOnTab() +{ + if (!qt_tab_all_widgets()) + QSKIP("This function doesn't support NOT iterating all."); + + QQuickView *window = new QQuickView(0); + window->setBaseSize(QSize(800,600)); + + window->setSource(testFileUrl("activeFocusOnTab.qml")); + window->show(); + window->requestActivate(); + QVERIFY(QTest::qWaitForWindowActive(window)); + QVERIFY(QGuiApplication::focusWindow() == window); + + // original: button1 + QQuickItem *item = findItem<QQuickItem>(window->rootObject(), "button1"); + QVERIFY(item); + QVERIFY(item->hasActiveFocus()); + + // Tab: button1->button2 + QKeyEvent key(QEvent::KeyPress, Qt::Key_Tab, Qt::NoModifier, "", false, 1); + QGuiApplication::sendEvent(window, &key); + QVERIFY(key.isAccepted()); + + item = findItem<QQuickItem>(window->rootObject(), "button2"); + QVERIFY(item); + QVERIFY(item->hasActiveFocus()); + + // Tab: button2->checkbox + key = QKeyEvent(QEvent::KeyPress, Qt::Key_Tab, Qt::NoModifier, "", false, 1); + QGuiApplication::sendEvent(window, &key); + QVERIFY(key.isAccepted()); + + item = findItem<QQuickItem>(window->rootObject(), "checkbox"); + QVERIFY(item); + QVERIFY(item->hasActiveFocus()); + + // Tab: checkbox->checkbox1 + key = QKeyEvent(QEvent::KeyPress, Qt::Key_Tab, Qt::NoModifier, "", false, 1); + QGuiApplication::sendEvent(window, &key); + QVERIFY(key.isAccepted()); + + item = findItem<QQuickItem>(window->rootObject(), "checkbox1"); + QVERIFY(item); + QVERIFY(item->hasActiveFocus()); + + // Tab: checkbox1->checkbox2 + key = QKeyEvent(QEvent::KeyPress, Qt::Key_Tab, Qt::NoModifier, "", false, 1); + QGuiApplication::sendEvent(window, &key); + QVERIFY(key.isAccepted()); + + item = findItem<QQuickItem>(window->rootObject(), "checkbox2"); + QVERIFY(item); + QVERIFY(item->hasActiveFocus()); + + // Tab: checkbox2->radiobutton + key = QKeyEvent(QEvent::KeyPress, Qt::Key_Tab, Qt::NoModifier, "", false, 1); + QGuiApplication::sendEvent(window, &key); + QVERIFY(key.isAccepted()); + + item = findItem<QQuickItem>(window->rootObject(), "radiobutton"); + QVERIFY(item); + QVERIFY(item->hasActiveFocus()); + + // Tab: radiobutton->radiobutton1 + key = QKeyEvent(QEvent::KeyPress, Qt::Key_Tab, Qt::NoModifier, "", false, 1); + QGuiApplication::sendEvent(window, &key); + QVERIFY(key.isAccepted()); + + item = findItem<QQuickItem>(window->rootObject(), "radiobutton1"); + QVERIFY(item); + QVERIFY(item->hasActiveFocus()); + + // Tab: radiobutton1->radiobutton2 + key = QKeyEvent(QEvent::KeyPress, Qt::Key_Tab, Qt::NoModifier, "", false, 1); + QGuiApplication::sendEvent(window, &key); + QVERIFY(key.isAccepted()); + + item = findItem<QQuickItem>(window->rootObject(), "radiobutton2"); + QVERIFY(item); + QVERIFY(item->hasActiveFocus()); + + // Tab: radiobutton2->slider + key = QKeyEvent(QEvent::KeyPress, Qt::Key_Tab, Qt::NoModifier, "", false, 1); + QGuiApplication::sendEvent(window, &key); + QVERIFY(key.isAccepted()); + + item = findItem<QQuickItem>(window->rootObject(), "slider"); + QVERIFY(item); + QVERIFY(item->hasActiveFocus()); + + // Tab: slider->switch + key = QKeyEvent(QEvent::KeyPress, Qt::Key_Tab, Qt::NoModifier, "", false, 1); + QGuiApplication::sendEvent(window, &key); + QVERIFY(key.isAccepted()); + + item = findItem<QQuickItem>(window->rootObject(), "switch"); + QVERIFY(item); + QVERIFY(item->hasActiveFocus()); + + // Tab: switch->tabbutton1 + key = QKeyEvent(QEvent::KeyPress, Qt::Key_Tab, Qt::NoModifier, "", false, 1); + QGuiApplication::sendEvent(window, &key); + QVERIFY(key.isAccepted()); + + item = findItem<QQuickItem>(window->rootObject(), "tabbutton1"); + QVERIFY(item); + QVERIFY(item->hasActiveFocus()); + + // Tab: tabbutton1->tabbutton2 + key = QKeyEvent(QEvent::KeyPress, Qt::Key_Tab, Qt::NoModifier, "", false, 1); + QGuiApplication::sendEvent(window, &key); + QVERIFY(key.isAccepted()); + + item = findItem<QQuickItem>(window->rootObject(), "tabbutton2"); + QVERIFY(item); + QVERIFY(item->hasActiveFocus()); + + // Tab: tabbutton2->textfield + key = QKeyEvent(QEvent::KeyPress, Qt::Key_Tab, Qt::NoModifier, "", false, 1); + QGuiApplication::sendEvent(window, &key); + QVERIFY(key.isAccepted()); + + item = findItem<QQuickItem>(window->rootObject(), "textfield"); + QVERIFY(item); + QVERIFY(item->hasActiveFocus()); + + // Tab: textfield->togglebutton + key = QKeyEvent(QEvent::KeyPress, Qt::Key_Tab, Qt::NoModifier, "", false, 1); + QGuiApplication::sendEvent(window, &key); + QVERIFY(key.isAccepted()); + + item = findItem<QQuickItem>(window->rootObject(), "togglebutton"); + QVERIFY(item); + QVERIFY(item->hasActiveFocus()); + + // Tab: togglebutton->toolbutton + key = QKeyEvent(QEvent::KeyPress, Qt::Key_Tab, Qt::NoModifier, "", false, 1); + QGuiApplication::sendEvent(window, &key); + QVERIFY(key.isAccepted()); + + item = findItem<QQuickItem>(window->rootObject(), "toolbutton"); + QVERIFY(item); + QVERIFY(item->hasActiveFocus()); + + // Tab: toolbutton->textarea + key = QKeyEvent(QEvent::KeyPress, Qt::Key_Tab, Qt::NoModifier, "", false, 1); + QGuiApplication::sendEvent(window, &key); + QVERIFY(key.isAccepted()); + + item = findItem<QQuickItem>(window->rootObject(), "textarea"); + QVERIFY(item); + QVERIFY(item->hasActiveFocus()); + + // BackTab: textarea->toolbutton + key = QKeyEvent(QEvent::KeyPress, Qt::Key_Tab, Qt::ShiftModifier, "", false, 1); + QGuiApplication::sendEvent(window, &key); + QVERIFY(key.isAccepted()); + + item = findItem<QQuickItem>(window->rootObject(), "toolbutton"); + QVERIFY(item); + QVERIFY(item->hasActiveFocus()); + + // BackTab: toolbutton->togglebutton + key = QKeyEvent(QEvent::KeyPress, Qt::Key_Tab, Qt::ShiftModifier, "", false, 1); + QGuiApplication::sendEvent(window, &key); + QVERIFY(key.isAccepted()); + + item = findItem<QQuickItem>(window->rootObject(), "togglebutton"); + QVERIFY(item); + QVERIFY(item->hasActiveFocus()); + + // BackTab: togglebutton->textfield + key = QKeyEvent(QEvent::KeyPress, Qt::Key_Tab, Qt::ShiftModifier, "", false, 1); + QGuiApplication::sendEvent(window, &key); + QVERIFY(key.isAccepted()); + + item = findItem<QQuickItem>(window->rootObject(), "textfield"); + QVERIFY(item); + QVERIFY(item->hasActiveFocus()); + + // BackTab: textfield->tabbutton2 + key = QKeyEvent(QEvent::KeyPress, Qt::Key_Tab, Qt::ShiftModifier, "", false, 1); + QGuiApplication::sendEvent(window, &key); + QVERIFY(key.isAccepted()); + + item = findItem<QQuickItem>(window->rootObject(), "tabbutton2"); + QVERIFY(item); + QVERIFY(item->hasActiveFocus()); + + // BackTab: tabbutton2->tabbutton2 + key = QKeyEvent(QEvent::KeyPress, Qt::Key_Tab, Qt::ShiftModifier, "", false, 1); + QGuiApplication::sendEvent(window, &key); + QVERIFY(key.isAccepted()); + + item = findItem<QQuickItem>(window->rootObject(), "tabbutton1"); + QVERIFY(item); + QVERIFY(item->hasActiveFocus()); + + // BackTab: tabbutton1->switch + key = QKeyEvent(QEvent::KeyPress, Qt::Key_Tab, Qt::ShiftModifier, "", false, 1); + QGuiApplication::sendEvent(window, &key); + QVERIFY(key.isAccepted()); + + item = findItem<QQuickItem>(window->rootObject(), "switch"); + QVERIFY(item); + QVERIFY(item->hasActiveFocus()); + + // BackTab: switch->switch + key = QKeyEvent(QEvent::KeyPress, Qt::Key_Tab, Qt::ShiftModifier, "", false, 1); + QGuiApplication::sendEvent(window, &key); + QVERIFY(key.isAccepted()); + + item = findItem<QQuickItem>(window->rootObject(), "slider"); + QVERIFY(item); + QVERIFY(item->hasActiveFocus()); + + // BackTab: slider->radiobutton2 + key = QKeyEvent(QEvent::KeyPress, Qt::Key_Tab, Qt::ShiftModifier, "", false, 1); + QGuiApplication::sendEvent(window, &key); + QVERIFY(key.isAccepted()); + + item = findItem<QQuickItem>(window->rootObject(), "radiobutton2"); + QVERIFY(item); + QVERIFY(item->hasActiveFocus()); + + // BackTab: radiobutton2->radiobutton1 + key = QKeyEvent(QEvent::KeyPress, Qt::Key_Tab, Qt::ShiftModifier, "", false, 1); + QGuiApplication::sendEvent(window, &key); + QVERIFY(key.isAccepted()); + + item = findItem<QQuickItem>(window->rootObject(), "radiobutton1"); + QVERIFY(item); + QVERIFY(item->hasActiveFocus()); + + // BackTab: radiobutton1->radiobutton + key = QKeyEvent(QEvent::KeyPress, Qt::Key_Tab, Qt::ShiftModifier, "", false, 1); + QGuiApplication::sendEvent(window, &key); + QVERIFY(key.isAccepted()); + + item = findItem<QQuickItem>(window->rootObject(), "radiobutton"); + QVERIFY(item); + QVERIFY(item->hasActiveFocus()); + + // BackTab: radiobutton->checkbox2 + key = QKeyEvent(QEvent::KeyPress, Qt::Key_Tab, Qt::ShiftModifier, "", false, 1); + QGuiApplication::sendEvent(window, &key); + QVERIFY(key.isAccepted()); + + item = findItem<QQuickItem>(window->rootObject(), "checkbox2"); + QVERIFY(item); + QVERIFY(item->hasActiveFocus()); + + // BackTab: checkbox2->checkbox1 + key = QKeyEvent(QEvent::KeyPress, Qt::Key_Tab, Qt::ShiftModifier, "", false, 1); + QGuiApplication::sendEvent(window, &key); + QVERIFY(key.isAccepted()); + + item = findItem<QQuickItem>(window->rootObject(), "checkbox1"); + QVERIFY(item); + QVERIFY(item->hasActiveFocus()); + + // BackTab: checkbox1->checkbox + key = QKeyEvent(QEvent::KeyPress, Qt::Key_Tab, Qt::ShiftModifier, "", false, 1); + QGuiApplication::sendEvent(window, &key); + QVERIFY(key.isAccepted()); + + item = findItem<QQuickItem>(window->rootObject(), "checkbox"); + QVERIFY(item); + QVERIFY(item->hasActiveFocus()); + + // BackTab: checkbox->button2 + key = QKeyEvent(QEvent::KeyPress, Qt::Key_Tab, Qt::ShiftModifier, "", false, 1); + QGuiApplication::sendEvent(window, &key); + QVERIFY(key.isAccepted()); + + item = findItem<QQuickItem>(window->rootObject(), "button2"); + QVERIFY(item); + QVERIFY(item->hasActiveFocus()); + + // BackTab: button2->button1 + key = QKeyEvent(QEvent::KeyPress, Qt::Key_Tab, Qt::ShiftModifier, "", false, 1); + QGuiApplication::sendEvent(window, &key); + QVERIFY(key.isAccepted()); + + item = findItem<QQuickItem>(window->rootObject(), "button1"); + QVERIFY(item); + QVERIFY(item->hasActiveFocus()); + + // BackTab: button1->textarea + key = QKeyEvent(QEvent::KeyPress, Qt::Key_Tab, Qt::ShiftModifier, "", false, 1); + QGuiApplication::sendEvent(window, &key); + QVERIFY(key.isAccepted()); + + item = findItem<QQuickItem>(window->rootObject(), "textarea"); + QVERIFY(item); + QVERIFY(item->hasActiveFocus()); + + // BackTab: textarea->toolbutton + key = QKeyEvent(QEvent::KeyPress, Qt::Key_Tab, Qt::ShiftModifier, "", false, 1); + QGuiApplication::sendEvent(window, &key); + QVERIFY(key.isAccepted()); + + item = findItem<QQuickItem>(window->rootObject(), "toolbutton"); + QVERIFY(item); + QVERIFY(item->hasActiveFocus()); + + delete window; +} + +void tst_activeFocusOnTab::activeFocusOnTab2() +{ + if (qt_tab_all_widgets()) + QSKIP("This function doesn't support iterating all."); + + QQuickView *window = new QQuickView(0); + window->setBaseSize(QSize(800,600)); + + window->setSource(testFileUrl("activeFocusOnTab.qml")); + window->show(); + window->requestActivate(); + QVERIFY(QTest::qWaitForWindowActive(window)); + QVERIFY(QGuiApplication::focusWindow() == window); + + // original: textfield + QQuickItem *item = findItem<QQuickItem>(window->rootObject(), "textfield"); + QVERIFY(item); + item->forceActiveFocus(); + QVERIFY(item->hasActiveFocus()); + + // Tab: textfield->textarea + QKeyEvent key(QEvent::KeyPress, Qt::Key_Tab, Qt::NoModifier, "", false, 1); + QGuiApplication::sendEvent(window, &key); + QVERIFY(key.isAccepted()); + + item = findItem<QQuickItem>(window->rootObject(), "textarea"); + QVERIFY(item); + QVERIFY(item->hasActiveFocus()); + + // BackTab: textarea->textfield + key = QKeyEvent(QEvent::KeyPress, Qt::Key_Tab, Qt::ShiftModifier, "", false, 1); + QGuiApplication::sendEvent(window, &key); + QVERIFY(key.isAccepted()); + + item = findItem<QQuickItem>(window->rootObject(), "textfield"); + QVERIFY(item); + QVERIFY(item->hasActiveFocus()); + + // BackTab: textfield->textarea + key = QKeyEvent(QEvent::KeyPress, Qt::Key_Tab, Qt::ShiftModifier, "", false, 1); + QGuiApplication::sendEvent(window, &key); + QVERIFY(key.isAccepted()); + + item = findItem<QQuickItem>(window->rootObject(), "textarea"); + QVERIFY(item); + QVERIFY(item->hasActiveFocus()); + + delete window; +} + +QTEST_MAIN(tst_activeFocusOnTab) + +#include "tst_activeFocusOnTab.moc" |