aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVolker Hilsheimer <volker.hilsheimer@qt.io>2021-11-30 21:10:44 +0100
committerDoris Verria <doris.verria@qt.io>2023-12-08 20:11:27 +0100
commit1ca9928856c47108000ffe5f310f2b99740f087b (patch)
tree7743dcf9dc75d003c40648724fb413880d722f93
parentfe0b70b352b364fe0c0eba5838d2ae1867fba604 (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.qdocinc21
-rw-r--r--src/quick/items/qquickitem.cpp25
-rw-r--r--src/quick/items/qquickitem.h6
-rw-r--r--src/quick/items/qquickitem_p.h2
-rw-r--r--src/quicktemplates/qquickcontrol.cpp30
-rw-r--r--src/quicktemplates/qquickcontrol_p.h4
-rw-r--r--src/quicktemplates/qquickcontrol_p_p.h1
-rw-r--r--src/quicktemplates/qquickspinbox.cpp2
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);