diff options
-rw-r--r-- | src/quick/util/qquickshortcut.cpp | 7 | ||||
-rw-r--r-- | tests/auto/quick/qquickshortcut/tst_qquickshortcut.cpp | 44 |
2 files changed, 51 insertions, 0 deletions
diff --git a/src/quick/util/qquickshortcut.cpp b/src/quick/util/qquickshortcut.cpp index 8e135b4624..2905e36d00 100644 --- a/src/quick/util/qquickshortcut.cpp +++ b/src/quick/util/qquickshortcut.cpp @@ -342,8 +342,15 @@ void QQuickShortcut::setContext(Qt::ShortcutContext context) return; ungrabShortcut(m_shortcut); + for (auto &s : m_shortcuts) + ungrabShortcut(s); + m_context = context; + grabShortcut(m_shortcut, context); + for (auto &s : m_shortcuts) + grabShortcut(s, context); + emit contextChanged(); } diff --git a/tests/auto/quick/qquickshortcut/tst_qquickshortcut.cpp b/tests/auto/quick/qquickshortcut/tst_qquickshortcut.cpp index 3a8ecb2b96..7b7113e2ce 100644 --- a/tests/auto/quick/qquickshortcut/tst_qquickshortcut.cpp +++ b/tests/auto/quick/qquickshortcut/tst_qquickshortcut.cpp @@ -48,6 +48,8 @@ private slots: void sequence(); void context_data(); void context(); + void contextChange_data(); + void contextChange(); void matcher_data(); void matcher(); void multiple_data(); @@ -462,6 +464,48 @@ void tst_QQuickShortcut::multiple() QCOMPARE(window->property("activated").toBool(), activated); } +void tst_QQuickShortcut::contextChange_data() +{ + multiple_data(); +} +void tst_QQuickShortcut::contextChange() +{ + QFETCH(QStringList, sequences); + QFETCH(Qt::Key, key); + QFETCH(Qt::KeyboardModifiers, modifiers); + QFETCH(bool, enabled); + QFETCH(bool, activated); + + QQmlApplicationEngine engine; + + engine.load(testFileUrl("multiple.qml")); + QQuickWindow *inactivewindow = qobject_cast<QQuickWindow *>(engine.rootObjects().value(0)); + QVERIFY(inactivewindow); + inactivewindow->show(); + QVERIFY(QTest::qWaitForWindowExposed(inactivewindow)); + + QObject *shortcut = inactivewindow->property("shortcut").value<QObject *>(); + QVERIFY(shortcut); + + shortcut->setProperty("enabled", enabled); + shortcut->setProperty("sequences", sequences); + shortcut->setProperty("context", Qt::WindowShortcut); + + engine.load(testFileUrl("multiple.qml")); + QQuickWindow *activewindow = qobject_cast<QQuickWindow *>(engine.rootObjects().value(1)); + QVERIFY(activewindow); + activewindow->show(); + QVERIFY(QTest::qWaitForWindowExposed(activewindow)); + + QTest::keyPress(activewindow, key, modifiers); + QCOMPARE(inactivewindow->property("activated").toBool(), false); + + shortcut->setProperty("context", Qt::ApplicationShortcut); + + QTest::keyPress(activewindow, key, modifiers); + QCOMPARE(inactivewindow->property("activated").toBool(), activated); +} + #ifdef QT_QUICKWIDGETS_LIB void tst_QQuickShortcut::quickWidgetShortcuts_data() { |