From a1d32483da20e8ba616bb5d32ef72928e012dac0 Mon Sep 17 00:00:00 2001 From: J-P Nurmi Date: Wed, 31 May 2017 15:51:07 +0200 Subject: Add QQuickItemPrivate::filterKeyEvent() This allows Qt Quick Controls 2 to support attached Keys signal handlers for an editable ComboBox by forwarding its internal text editor's key events to the attached Keys handler of the ComboBox control. Task-number: QTBUG-61135 Change-Id: Ib642133a19389beb04a3b53375c083d17e185500 Reviewed-by: J-P Nurmi Reviewed-by: Shawn Rutledge Reviewed-by: Liang Qi --- src/quick/items/qquickitem.cpp | 42 +++++++++++++++++++++--------------------- src/quick/items/qquickitem_p.h | 1 + 2 files changed, 22 insertions(+), 21 deletions(-) (limited to 'src/quick/items') diff --git a/src/quick/items/qquickitem.cpp b/src/quick/items/qquickitem.cpp index 9f2d543387..3a11a1f3fe 100644 --- a/src/quick/items/qquickitem.cpp +++ b/src/quick/items/qquickitem.cpp @@ -5029,22 +5029,31 @@ void QQuickItemPrivate::transformChanged() #endif } +bool QQuickItemPrivate::filterKeyEvent(QKeyEvent *e, bool post) +{ + if (!extra.isAllocated() || !extra->keyHandler) + return false; + + if (post) + e->accept(); + + if (e->type() == QEvent::KeyPress) + extra->keyHandler->keyPressed(e, post); + else + extra->keyHandler->keyReleased(e, post); + + return e->isAccepted(); +} + void QQuickItemPrivate::deliverKeyEvent(QKeyEvent *e) { Q_Q(QQuickItem); Q_ASSERT(e->isAccepted()); - if (extra.isAllocated() && extra->keyHandler) { - if (e->type() == QEvent::KeyPress) - extra->keyHandler->keyPressed(e, false); - else - extra->keyHandler->keyReleased(e, false); - - if (e->isAccepted()) - return; - else - e->accept(); - } + if (filterKeyEvent(e, false)) + return; + else + e->accept(); if (e->type() == QEvent::KeyPress) q->keyPressEvent(e); @@ -5054,16 +5063,7 @@ void QQuickItemPrivate::deliverKeyEvent(QKeyEvent *e) if (e->isAccepted()) return; - if (extra.isAllocated() && extra->keyHandler) { - e->accept(); - - if (e->type() == QEvent::KeyPress) - extra->keyHandler->keyPressed(e, true); - else - extra->keyHandler->keyReleased(e, true); - } - - if (e->isAccepted() || !q->window()) + if (filterKeyEvent(e, true) || !q->window()) return; //only care about KeyPress now diff --git a/src/quick/items/qquickitem_p.h b/src/quick/items/qquickitem_p.h index d1aaf6026b..446a7d0945 100644 --- a/src/quick/items/qquickitem_p.h +++ b/src/quick/items/qquickitem_p.h @@ -564,6 +564,7 @@ public: virtual void transformChanged(); void deliverKeyEvent(QKeyEvent *); + bool filterKeyEvent(QKeyEvent *, bool post); #if QT_CONFIG(im) void deliverInputMethodEvent(QInputMethodEvent *); #endif -- cgit v1.2.3