diff options
author | Volker Hilsheimer <volker.hilsheimer@qt.io> | 2021-11-30 21:10:44 +0100 |
---|---|---|
committer | Doris Verria <doris.verria@qt.io> | 2023-12-08 20:11:27 +0100 |
commit | 1ca9928856c47108000ffe5f310f2b99740f087b (patch) | |
tree | 7743dcf9dc75d003c40648724fb413880d722f93 | |
parent | fe0b70b352b364fe0c0eba5838d2ae1867fba604 (diff) |
Move focusReason from QQuickControl to QQuickItem
[ChangeLog][QtQuick][Item] The focusReason property has now
moved from QQuickControl to QQuickItem.
Task-number: QTBUG-117596
Change-Id: I7ddfbe535b6f0e7289dd3408a074ad0b8aa4de01
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
-rw-r--r-- | src/quick/doc/src/includes/item.qdocinc | 21 | ||||
-rw-r--r-- | src/quick/items/qquickitem.cpp | 25 | ||||
-rw-r--r-- | src/quick/items/qquickitem.h | 6 | ||||
-rw-r--r-- | src/quick/items/qquickitem_p.h | 2 | ||||
-rw-r--r-- | src/quicktemplates/qquickcontrol.cpp | 30 | ||||
-rw-r--r-- | src/quicktemplates/qquickcontrol_p.h | 4 | ||||
-rw-r--r-- | src/quicktemplates/qquickcontrol_p_p.h | 1 | ||||
-rw-r--r-- | src/quicktemplates/qquickspinbox.cpp | 2 |
8 files changed, 62 insertions, 29 deletions
diff --git a/src/quick/doc/src/includes/item.qdocinc b/src/quick/doc/src/includes/item.qdocinc index 4cb2652bbf..f70d3b483c 100644 --- a/src/quick/doc/src/includes/item.qdocinc +++ b/src/quick/doc/src/includes/item.qdocinc @@ -13,3 +13,24 @@ accept the event if you reimplement this function. If you don't accept the event, call \c event->ignore(). //! [accepting-events] + + +//! [focus-reason] + +This property holds the reason of the last focus change. + +\note This property does not indicate whether the item has \l {Item::activeFocus} + {active focus}, but the reason why the item either gained or lost focus. + +\value Qt.MouseFocusReason A mouse action occurred. +\value Qt.TabFocusReason The Tab key was pressed. +\value Qt.BacktabFocusReason A Backtab occurred. The input for this may include the Shift or Control keys; e.g. Shift+Tab. +\value Qt.ActiveWindowFocusReason The window system made this window either active or inactive. +\value Qt.PopupFocusReason The application opened/closed a pop-up that grabbed/released the keyboard focus. +\value Qt.ShortcutFocusReason The user typed a label's buddy shortcut +\value Qt.MenuBarFocusReason The menu bar took focus. +\value Qt.OtherFocusReason Another reason, usually application-specific. + +\sa Item::activeFocus + +//! [focus-reason] diff --git a/src/quick/items/qquickitem.cpp b/src/quick/items/qquickitem.cpp index 1e9d9cb1d9..153c9ead3d 100644 --- a/src/quick/items/qquickitem.cpp +++ b/src/quick/items/qquickitem.cpp @@ -3198,6 +3198,7 @@ QQuickItemPrivate::QQuickItemPrivate() , maybeHasSubsceneDeliveryAgent(true) , subtreeTransformChangedEnabled(true) , inDestructor(false) + , focusReason(Qt::OtherFocusReason) , dirtyAttributes(0) , nextDirtyItem(nullptr) , prevDirtyItem(nullptr) @@ -7834,6 +7835,30 @@ QQuickItem *QQuickItem::scopedFocusItem() const } /*! + \qmlproperty enumeration QtQuick::Item::focusReason + \since 6.7 + + \input item.qdocinc focus-reason + + \note This property was a member of {QQuickControl} {Control} until Qt 6.7. +*/ +Qt::FocusReason QQuickItem::focusReason() const +{ + Q_D(const QQuickItem); + return static_cast<Qt::FocusReason>(d->focusReason); +} + +void QQuickItem::setFocusReason(Qt::FocusReason reason) +{ + Q_D(QQuickItem); + if (d->focusReason == reason) + return; + + d->focusReason = reason; + emit focusReasonChanged(); +} + +/*! Returns \c true if this item is an ancestor of \a child (i.e., if this item is \a child's parent, or one of \a child's parent's ancestors). diff --git a/src/quick/items/qquickitem.h b/src/quick/items/qquickitem.h index 4f184d3118..d3d9c2cad4 100644 --- a/src/quick/items/qquickitem.h +++ b/src/quick/items/qquickitem.h @@ -101,6 +101,8 @@ class Q_QUICK_EXPORT QQuickItem : public QObject, public QQmlParserStatus Q_PROPERTY(bool focus READ hasFocus WRITE setFocus NOTIFY focusChanged FINAL) Q_PROPERTY(bool activeFocus READ hasActiveFocus NOTIFY activeFocusChanged FINAL) Q_PROPERTY(bool activeFocusOnTab READ activeFocusOnTab WRITE setActiveFocusOnTab NOTIFY activeFocusOnTabChanged FINAL REVISION(2, 1)) + QT6_ONLY(Q_PROPERTY(Qt::FocusReason focusReason READ focusReason WRITE setFocusReason NOTIFY focusReasonChanged)) + QT7_ONLY(Q_PROPERTY(Qt::FocusReason focusReason READ focusReason WRITE setFocusReason NOTIFY focusReasonChanged FINAL)) Q_PROPERTY(qreal rotation READ rotation WRITE setRotation NOTIFY rotationChanged) Q_PROPERTY(qreal scale READ scale WRITE setScale NOTIFY scaleChanged) @@ -270,6 +272,9 @@ public: bool isFocusScope() const; QQuickItem *scopedFocusItem() const; + Qt::FocusReason focusReason() const; + void setFocusReason(Qt::FocusReason reason); + bool isAncestorOf(const QQuickItem *child) const; Qt::MouseButtons acceptedMouseButtons() const; @@ -383,6 +388,7 @@ Q_SIGNALS: void stateChanged(const QString &); void focusChanged(bool); void activeFocusChanged(bool); + Q_REVISION(6, 7) void focusReasonChanged(); Q_REVISION(2, 1) void activeFocusOnTabChanged(bool); void parentChanged(QQuickItem *); void transformOriginChanged(TransformOrigin); diff --git a/src/quick/items/qquickitem_p.h b/src/quick/items/qquickitem_p.h index 63c8896680..db96459fca 100644 --- a/src/quick/items/qquickitem_p.h +++ b/src/quick/items/qquickitem_p.h @@ -491,6 +491,8 @@ public: // (e.g. when parent has ItemIsViewport and child has ItemObservesViewport) quint32 subtreeTransformChangedEnabled:1; quint32 inDestructor:1; // has entered ~QQuickItem + quint32 focusReason:4; + // Bit 49 enum DirtyType { TransformOrigin = 0x00000001, diff --git a/src/quicktemplates/qquickcontrol.cpp b/src/quicktemplates/qquickcontrol.cpp index 202b91cc43..4373023dae 100644 --- a/src/quicktemplates/qquickcontrol.cpp +++ b/src/quicktemplates/qquickcontrol.cpp @@ -973,7 +973,7 @@ void QQuickControl::itemChange(QQuickItem::ItemChange change, const QQuickItem:: } break; case ItemActiveFocusHasChanged: - if (isKeyFocusReason(d->focusReason)) + if (isKeyFocusReason(static_cast<Qt::FocusReason>(d->focusReason))) emit visualFocusChanged(); break; default: @@ -1393,29 +1393,11 @@ void QQuickControl::setFocusPolicy(Qt::FocusPolicy policy) emit focusPolicyChanged(); } -/*! - \qmlproperty enumeration QtQuick.Controls::Control::focusReason - \readonly - - \include qquickcontrol-focusreason.qdocinc - - \sa visualFocus -*/ -Qt::FocusReason QQuickControl::focusReason() const -{ - Q_D(const QQuickControl); - return d->focusReason; -} - void QQuickControl::setFocusReason(Qt::FocusReason reason) { - Q_D(QQuickControl); - if (d->focusReason == reason) - return; - - Qt::FocusReason oldReason = d->focusReason; - d->focusReason = reason; - emit focusReasonChanged(); + Q_D(const QQuickControl); + Qt::FocusReason oldReason = static_cast<Qt::FocusReason>(d->focusReason); + QQuickItem::setFocusReason(reason); if (isKeyFocusReason(oldReason) != isKeyFocusReason(reason)) emit visualFocusChanged(); } @@ -1432,12 +1414,12 @@ void QQuickControl::setFocusReason(Qt::FocusReason reason) \l Item::activeFocus. This ensures that key focus is only visualized when interacting with keys - not when interacting via touch or mouse. - \sa focusReason, Item::activeFocus + \sa Item::focusReason, Item::activeFocus */ bool QQuickControl::hasVisualFocus() const { Q_D(const QQuickControl); - return d->activeFocus && isKeyFocusReason(d->focusReason); + return d->activeFocus && isKeyFocusReason(static_cast<Qt::FocusReason>(d->focusReason)); } /*! diff --git a/src/quicktemplates/qquickcontrol_p.h b/src/quicktemplates/qquickcontrol_p.h index 1503866a00..3f5cfea6f1 100644 --- a/src/quicktemplates/qquickcontrol_p.h +++ b/src/quicktemplates/qquickcontrol_p.h @@ -40,7 +40,7 @@ class Q_QUICKTEMPLATES2_PRIVATE_EXPORT QQuickControl : public QQuickItem Q_PROPERTY(QLocale locale READ locale WRITE setLocale RESET resetLocale NOTIFY localeChanged FINAL) Q_PROPERTY(bool mirrored READ isMirrored NOTIFY mirroredChanged FINAL) Q_PROPERTY(Qt::FocusPolicy focusPolicy READ focusPolicy WRITE setFocusPolicy NOTIFY focusPolicyChanged FINAL) - Q_PROPERTY(Qt::FocusReason focusReason READ focusReason WRITE setFocusReason NOTIFY focusReasonChanged FINAL) + QT6_ONLY(Q_PROPERTY(Qt::FocusReason focusReason READ focusReason WRITE setFocusReason NOTIFY focusReasonChanged FINAL)) Q_PROPERTY(bool visualFocus READ hasVisualFocus NOTIFY visualFocusChanged FINAL) Q_PROPERTY(bool hovered READ isHovered NOTIFY hoveredChanged FINAL) Q_PROPERTY(bool hoverEnabled READ isHoverEnabled WRITE setHoverEnabled RESET resetHoverEnabled NOTIFY hoverEnabledChanged FINAL) @@ -107,7 +107,6 @@ public: Qt::FocusPolicy focusPolicy() const; void setFocusPolicy(Qt::FocusPolicy policy); - Qt::FocusReason focusReason() const; void setFocusReason(Qt::FocusReason reason); bool hasVisualFocus() const; @@ -176,7 +175,6 @@ Q_SIGNALS: void localeChanged(); void mirroredChanged(); void focusPolicyChanged(); - void focusReasonChanged(); void visualFocusChanged(); void hoveredChanged(); void hoverEnabledChanged(); diff --git a/src/quicktemplates/qquickcontrol_p_p.h b/src/quicktemplates/qquickcontrol_p_p.h index 5784936004..2e2169705b 100644 --- a/src/quicktemplates/qquickcontrol_p_p.h +++ b/src/quicktemplates/qquickcontrol_p_p.h @@ -207,7 +207,6 @@ public: QLocale locale; QFont resolvedFont; Qt::FocusPolicy focusPolicy = Qt::NoFocus; - Qt::FocusReason focusReason = Qt::OtherFocusReason; QQuickDeferredPointer<QQuickItem> background; QQuickDeferredPointer<QQuickItem> contentItem; }; diff --git a/src/quicktemplates/qquickspinbox.cpp b/src/quicktemplates/qquickspinbox.cpp index 8700974f62..2f40bd1292 100644 --- a/src/quicktemplates/qquickspinbox.cpp +++ b/src/quicktemplates/qquickspinbox.cpp @@ -1100,7 +1100,7 @@ void QQuickSpinBox::contentItemChange(QQuickItem *newItem, QQuickItem *oldItem) if (newItem) { newItem->setActiveFocusOnTab(true); if (d->activeFocus) - newItem->forceActiveFocus(d->focusReason); + newItem->forceActiveFocus(static_cast<Qt::FocusReason>(d->focusReason)); #if QT_CONFIG(cursor) if (d->editable) newItem->setCursor(Qt::IBeamCursor); |