diff options
author | Mitch Curtis <mitch.curtis@qt.io> | 2018-03-19 12:02:44 +0100 |
---|---|---|
committer | Mitch Curtis <mitch.curtis@qt.io> | 2018-03-22 06:58:42 +0000 |
commit | 1f118ce85b8c29d713d2feae529ec8a71ba28048 (patch) | |
tree | a00fc88c01b89dd0b48b8d0c9ac9853a57091e1c | |
parent | bb30edf15815006bac3ecddfa958055a92057600 (diff) |
Fix Shortcuts in Popups with window context not being activated
Before this patch, this code wouldn't work:
Popup {
id: popup
Shortcut {
sequence: "Tab"
onActivated: popup.visible = !popup.visible
}
}
Even though Popup is aware of its Window, the Shortcut object is
parented to Popup::contentItem, which does not have a Window associated
with it while the Popup is hidden.
The fix is to check if the item has a window in
QQuickShortcutContext::matcher(), so that that check fails and the
QQuickPopup itself is used to access the window.
Change-Id: Ia1c5d75ad6b82fb4c8b7664b6d418d84428b1ddf
Reviewed-by: J-P Nurmi <jpnurmi@qt.io>
-rw-r--r-- | src/quicktemplates2/qquickshortcutcontext.cpp | 2 | ||||
-rw-r--r-- | tests/auto/controls/data/tst_popup.qml | 38 |
2 files changed, 38 insertions, 2 deletions
diff --git a/src/quicktemplates2/qquickshortcutcontext.cpp b/src/quicktemplates2/qquickshortcutcontext.cpp index e94de722..4e4b46fa 100644 --- a/src/quicktemplates2/qquickshortcutcontext.cpp +++ b/src/quicktemplates2/qquickshortcutcontext.cpp @@ -77,7 +77,7 @@ bool QQuickShortcutContext::matcher(QObject *obj, Qt::ShortcutContext context) case Qt::WindowShortcut: while (obj && !obj->isWindowType()) { item = qobject_cast<QQuickItem *>(obj); - if (item) { + if (item && item->window()) { obj = item->window(); break; } else if (QQuickPopup *popup = qobject_cast<QQuickPopup *>(obj)) { diff --git a/tests/auto/controls/data/tst_popup.qml b/tests/auto/controls/data/tst_popup.qml index 3f9f5e48..a6c24cb7 100644 --- a/tests/auto/controls/data/tst_popup.qml +++ b/tests/auto/controls/data/tst_popup.qml @@ -48,7 +48,7 @@ ** ****************************************************************************/ -import QtQuick 2.4 +import QtQuick 2.11 import QtTest 1.0 import QtQuick.Controls 2.3 import QtQuick.Templates 2.3 as T @@ -1269,4 +1269,40 @@ TestCase { compare(control.background.width, 200 + (control.background.leftInset || 0) + (control.background.rightInset || 0)) compare(control.background.height, 100 + (control.background.topInset || 0) + (control.background.bottomInset || 0)) } + + + Component { + id: shortcutWindowComponent + ApplicationWindow { + id: window + width: 360 + height: 360 + visible: true + + property alias popup: popup + + Popup { + id: popup + + Shortcut { + sequence: "Tab" + onActivated: popup.visible = !popup.visible + } + } + } + } + + function test_shortcut() { + // Tests that a Shortcut with Qt.WindowShortcut context + // that is declared within a Popup is activated. + var window = createTemporaryObject(shortcutWindowComponent, testCase) + var control = window.popup + + waitForRendering(window.contentItem) + keyClick(Qt.Key_Tab) + tryCompare(control, "visible", true) + + keyClick(Qt.Key_Tab) + tryCompare(control, "visible", false) + } } |