diff options
author | Teemu Holappa <teemu.holappa@qt.io> | 2019-10-09 10:52:47 +0300 |
---|---|---|
committer | Teemu Holappa <teemu.holappa@qt.io> | 2019-10-09 20:02:05 +0300 |
commit | 6b6ef3a8417e628ca01a1c2cad81af69ea5c9d3a (patch) | |
tree | 7d3164b0c344c2a5fd5236bd815ff9e82441f3f9 | |
parent | aa02de3c2a3a41e897814b751ec810074f250893 (diff) |
Send ShortcutOverride event when receiving a non-spontaneous key press
This is a very similar fix what's been done to the widgets to fix
QTBUG-48325. In QQuickWindow there is added the sending of
a ShortCutOverride even when a non-spontaneous KeyPress event
is received.
Task-number: QTBUG-78304
Change-Id: Icb267e611248460533f20e84deef71da6b481cd2
Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
-rw-r--r-- | src/quick/items/qquickwindow.cpp | 8 | ||||
-rw-r--r-- | tests/auto/quick/qquickwindow/data/shortcut.qml | 47 | ||||
-rw-r--r-- | tests/auto/quick/qquickwindow/tst_qquickwindow.cpp | 28 |
3 files changed, 83 insertions, 0 deletions
diff --git a/src/quick/items/qquickwindow.cpp b/src/quick/items/qquickwindow.cpp index 64d7232354..b83c9159a4 100644 --- a/src/quick/items/qquickwindow.cpp +++ b/src/quick/items/qquickwindow.cpp @@ -102,6 +102,7 @@ Q_LOGGING_CATEGORY(DBG_DIRTY, "qt.quick.dirty") Q_LOGGING_CATEGORY(lcTransient, "qt.quick.window.transient") extern Q_GUI_EXPORT QImage qt_gl_read_framebuffer(const QSize &size, bool alpha_format, bool include_alpha); +extern Q_GUI_EXPORT bool qt_sendShortcutOverrideEvent(QObject *o, ulong timestamp, int k, Qt::KeyboardModifiers mods, const QString &text = QString(), bool autorep = false, ushort count = 1); bool QQuickWindowPrivate::defaultAlphaBuffer = false; @@ -1794,6 +1795,13 @@ void QQuickWindowPrivate::deliverKeyEvent(QKeyEvent *e) { if (activeFocusItem) { QQuickItem *item = activeFocusItem; + + // In case of generated event, trigger ShortcutOverride event + if (e->type() == QEvent::KeyPress && e->spontaneous() == false) + qt_sendShortcutOverrideEvent(item, e->timestamp(), + e->key(), e->modifiers(), e->text(), + e->isAutoRepeat(), e->count()); + e->accept(); QCoreApplication::sendEvent(item, e); while (!e->isAccepted() && (item = item->parentItem())) { diff --git a/tests/auto/quick/qquickwindow/data/shortcut.qml b/tests/auto/quick/qquickwindow/data/shortcut.qml new file mode 100644 index 0000000000..2632e27859 --- /dev/null +++ b/tests/auto/quick/qquickwindow/data/shortcut.qml @@ -0,0 +1,47 @@ +/**************************************************************************** +** +** Copyright (C) 2019 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:GPL-EXCEPT$ +** 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 https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +import QtQuick 2.9 +import QtQuick.Window 2.2 + +Window { + id: root + visible: true + width: 200 + height: 200 + property bool received: false + Item { + focus: true + Shortcut { + sequence: "B" + onActivated: { + root.received = true + } + } + } +} + diff --git a/tests/auto/quick/qquickwindow/tst_qquickwindow.cpp b/tests/auto/quick/qquickwindow/tst_qquickwindow.cpp index f08b9207d1..7faa621e86 100644 --- a/tests/auto/quick/qquickwindow/tst_qquickwindow.cpp +++ b/tests/auto/quick/qquickwindow/tst_qquickwindow.cpp @@ -482,6 +482,10 @@ private slots: void testChildMouseEventFilter_data(); void cleanupGrabsOnRelease(); +#if QT_CONFIG(shortcut) + void testShortCut(); +#endif + private: QTouchDevice *touchDevice; QTouchDevice *touchDeviceWithVelocity; @@ -3579,6 +3583,30 @@ void tst_qquickwindow::cleanupGrabsOnRelease() QCOMPARE(parent->mouseUngrabEventCount, 1); } +#if QT_CONFIG(shortcut) +void tst_qquickwindow::testShortCut() +{ + QQmlEngine engine; + QQmlComponent component(&engine); + component.loadUrl(testFileUrl("shortcut.qml")); + + QObject *created = component.create(); + QScopedPointer<QObject> cleanup(created); + QVERIFY(created); + + QQuickWindow *window = qobject_cast<QQuickWindow *>(created); + QVERIFY(QTest::qWaitForWindowActive(window)); + + EventFilter eventFilter; + window->activeFocusItem()->installEventFilter(&eventFilter); + //Send non-spontaneous key press event + QKeyEvent keyEvent(QEvent::KeyPress, Qt::Key_B, Qt::NoModifier); + QCoreApplication::sendEvent(window, &keyEvent); + QVERIFY(eventFilter.events.contains(int(QEvent::ShortcutOverride))); + QVERIFY(window->property("received").value<bool>()); +} +#endif + QTEST_MAIN(tst_qquickwindow) #include "tst_qquickwindow.moc" |