diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/quick/items/qquickitem.cpp | 66 | ||||
-rw-r--r-- | src/quick/items/qquickitem_p.h | 4 | ||||
-rw-r--r-- | src/quick/util/qquickshortcut.cpp | 2 |
3 files changed, 71 insertions, 1 deletions
diff --git a/src/quick/items/qquickitem.cpp b/src/quick/items/qquickitem.cpp index ca8ef7ba2e..504446a8be 100644 --- a/src/quick/items/qquickitem.cpp +++ b/src/quick/items/qquickitem.cpp @@ -333,6 +333,12 @@ QVariant QQuickItemKeyFilter::inputMethodQuery(Qt::InputMethodQuery query) const } #endif // im +void QQuickItemKeyFilter::shortcutOverride(QKeyEvent *event) +{ + if (m_next) + m_next->shortcutOverride(event); +} + void QQuickItemKeyFilter::componentComplete() { if (m_next) m_next->componentComplete(); @@ -935,6 +941,46 @@ bool QQuickKeysAttached::isConnected(const char *signalName) const */ /*! + \qmlsignal QtQuick::Keys::shortcutOverride(KeyEvent event) + \since 5.9 + + This signal is emitted when a key has been pressed that could potentially + be used as a shortcut. The \a event parameter provides information about + the event. + + Set \c event.accepted to \c true if you wish to prevent the pressed key + from being used as a shortcut by other types, such as \l Shortcut. For + example: + + \code + Item { + id: escapeItem + focus: true + + // Ensure that we get escape key press events first. + Keys.onShortcutOverride: event.accepted = (event.key === Qt.Key_Escape) + + Keys.onEscapePressed: { + console.log("escapeItem is handling escape"); + event.accepted = true; + } + } + + Shortcut { + sequence: "Escape" + onActivated: console.log("Shortcut is handling escape") + } + \endcode + + As with the other signals, \c shortcutOverride will only be emitted for an + item if that item has \l {Item::}{activeFocus}. + + The corresponding handler is \c onShortcutOverride. + + \sa Shortcut +*/ + +/*! \qmlsignal QtQuick::Keys::digit0Pressed(KeyEvent event) This signal is emitted when the digit '0' has been pressed. The \a event @@ -1426,6 +1472,16 @@ QVariant QQuickKeysAttached::inputMethodQuery(Qt::InputMethodQuery query) const } #endif // im +void QQuickKeysAttached::shortcutOverride(QKeyEvent *event) +{ + Q_D(QQuickKeysAttached); + QQuickKeyEvent &keyEvent = d->theKeyEvent; + keyEvent.reset(*event); + emit shortcutOverride(&keyEvent); + + event->setAccepted(keyEvent.isAccepted()); +} + QQuickKeysAttached *QQuickKeysAttached::qmlAttachedProperties(QObject *obj) { return new QQuickKeysAttached(obj); @@ -5019,6 +5075,13 @@ void QQuickItemPrivate::deliverInputMethodEvent(QInputMethodEvent *e) } #endif // im +void QQuickItemPrivate::deliverShortcutOverrideEvent(QKeyEvent *event) +{ + if (extra.isAllocated() && extra->keyHandler) { + extra->keyHandler->shortcutOverride(event); + } +} + /*! Called when \a change occurs for this item. @@ -7652,6 +7715,9 @@ bool QQuickItem::event(QEvent *ev) case QEvent::KeyRelease: d->deliverKeyEvent(static_cast<QKeyEvent*>(ev)); break; + case QEvent::ShortcutOverride: + d->deliverShortcutOverrideEvent(static_cast<QKeyEvent*>(ev)); + break; case QEvent::FocusIn: focusInEvent(static_cast<QFocusEvent*>(ev)); break; diff --git a/src/quick/items/qquickitem_p.h b/src/quick/items/qquickitem_p.h index 3002b73a8c..c0c9bd46bd 100644 --- a/src/quick/items/qquickitem_p.h +++ b/src/quick/items/qquickitem_p.h @@ -559,6 +559,7 @@ public: #if QT_CONFIG(im) void deliverInputMethodEvent(QInputMethodEvent *); #endif + void deliverShortcutOverrideEvent(QKeyEvent *); bool isTransparentForPositioner() const; void setTransparentForPositioner(bool trans); @@ -622,6 +623,7 @@ public: virtual void inputMethodEvent(QInputMethodEvent *event, bool post); virtual QVariant inputMethodQuery(Qt::InputMethodQuery query) const; #endif + virtual void shortcutOverride(QKeyEvent *event); virtual void componentComplete(); bool m_processPost; @@ -813,6 +815,7 @@ Q_SIGNALS: void priorityChanged(); void pressed(QQuickKeyEvent *event); void released(QQuickKeyEvent *event); + void shortcutOverride(QQuickKeyEvent *event); void digit0Pressed(QQuickKeyEvent *event); void digit1Pressed(QQuickKeyEvent *event); void digit2Pressed(QQuickKeyEvent *event); @@ -861,6 +864,7 @@ private: void inputMethodEvent(QInputMethodEvent *, bool post) Q_DECL_OVERRIDE; QVariant inputMethodQuery(Qt::InputMethodQuery query) const Q_DECL_OVERRIDE; #endif + void shortcutOverride(QKeyEvent *event) override; static QByteArray keyToSignal(int key); bool isConnected(const char *signalName) const; diff --git a/src/quick/util/qquickshortcut.cpp b/src/quick/util/qquickshortcut.cpp index a0a58f2e02..72d9c889e3 100644 --- a/src/quick/util/qquickshortcut.cpp +++ b/src/quick/util/qquickshortcut.cpp @@ -73,7 +73,7 @@ It is also possible to set multiple shortcut \l sequences, so that the shortcut can be \l activated via several different sequences of key presses. - \sa Keys + \sa Keys, {Keys::}{shortcutOverride()} */ /*! \qmlsignal QtQuick::Shortcut::activated() |