diff options
author | Andreas Buhr <andreas@andreasbuhr.de> | 2021-01-13 13:45:43 +0100 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2021-01-13 18:06:49 +0000 |
commit | b94aaa4863b2ed3204da056792415a1f7d089ec6 (patch) | |
tree | 9c30eebeac3d6fdabf15c8dc41e066c3ec609680 | |
parent | 0ff25e23c69571983bbf34c41bc5445a1fbf4f66 (diff) |
Fix QQuickShortcut::setContext so re-grab all shortcuts
A while ago, QQuickShortcut was extended to not only have a shortcut
m_shortcut but in addition a list m_shortcuts. During this extension,
the setContext method was missed: Shortcuts in m_shortcuts are
not re-grabbed on context change. This patch fixes this.
Task-number: QTBUG-88682
Change-Id: Ie73d516f2a325a328b6e975d69490eea29a18401
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
(cherry picked from commit 28f515e6334fd1c15a2f7f18de6be7bfe1f9c302)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
-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() { |