diff options
author | Mitch Curtis <mitch.curtis@qt.io> | 2019-11-07 12:42:12 +0100 |
---|---|---|
committer | Mitch Curtis <mitch.curtis@qt.io> | 2019-12-04 12:26:10 +0100 |
commit | 75b6ef710cddbf9395df35650438f0feb57ec076 (patch) | |
tree | a9efb9180d8eb86f2badc138b58fe62b9c7e7bdc /src | |
parent | 463898f0765b83f6c391f6802a0ee06796f9f6d2 (diff) |
SplitView: fix hoverable child items breaking handle hover state
Detect HoverEnter events by filtering the mouse events of child items,
and respond by clearing any hovered handle.
Change-Id: Ice7e7fe3cc4c9224064c2384cd832e4a7d91c4da
Fixes: QTBUG-79846
Reviewed-by: Richard Moe Gustavsen <richard.gustavsen@qt.io>
Diffstat (limited to 'src')
-rw-r--r-- | src/quicktemplates2/qquicksplitview.cpp | 19 | ||||
-rw-r--r-- | src/quicktemplates2/qquicksplitview_p.h | 1 |
2 files changed, 20 insertions, 0 deletions
diff --git a/src/quicktemplates2/qquicksplitview.cpp b/src/quicktemplates2/qquicksplitview.cpp index 45efdc75..219a6b08 100644 --- a/src/quicktemplates2/qquicksplitview.cpp +++ b/src/quicktemplates2/qquicksplitview.cpp @@ -80,6 +80,9 @@ QT_BEGIN_NAMESPACE \li \l{SplitHandle::pressed}{SplitHandle.pressed} \endlist + \note Handles should be purely visual and not handle events, as it can + interfere with their hovered and pressed states. + The preferred size of items in a SplitView can be specified via \l{Item::}{implicitWidth} and \l{Item::}{implicitHeight} or \c SplitView.preferredWidth and \c SplitView.preferredHeight: @@ -1091,6 +1094,7 @@ QQuickSplitView::QQuickSplitView(QQuickItem *parent) d->changeTypes |= QQuickItemPrivate::Visibility; setAcceptedMouseButtons(Qt::LeftButton); + setFiltersChildMouseEvents(true); } QQuickSplitView::QQuickSplitView(QQuickSplitViewPrivate &dd, QQuickItem *parent) @@ -1100,6 +1104,7 @@ QQuickSplitView::QQuickSplitView(QQuickSplitViewPrivate &dd, QQuickItem *parent) d->changeTypes |= QQuickItemPrivate::Visibility; setAcceptedMouseButtons(Qt::LeftButton); + setFiltersChildMouseEvents(true); } QQuickSplitView::~QQuickSplitView() @@ -1364,6 +1369,20 @@ void QQuickSplitView::hoverMoveEvent(QHoverEvent *event) d->updateHoveredHandle(hoveredItem); } +bool QQuickSplitView::childMouseEventFilter(QQuickItem *item, QEvent *event) +{ + Q_D(QQuickSplitView); + qCDebug(qlcQQuickSplitViewMouse) << "childMouseEventFilter called with" << item << event; + if (event->type() != QEvent::HoverEnter) + return false; + + // If a child item received a hover enter event, then it means our handle is no longer hovered. + // Handles should be purely visual and not accept hover events, + // so we should never get hover events for them here. + d->updateHoveredHandle(nullptr); + return false; +} + void QQuickSplitView::geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry) { Q_D(QQuickSplitView); diff --git a/src/quicktemplates2/qquicksplitview_p.h b/src/quicktemplates2/qquicksplitview_p.h index 99001615..2fa15588 100644 --- a/src/quicktemplates2/qquicksplitview_p.h +++ b/src/quicktemplates2/qquicksplitview_p.h @@ -99,6 +99,7 @@ protected: void componentComplete() override; void hoverMoveEvent(QHoverEvent *event) override; + bool childMouseEventFilter(QQuickItem *item, QEvent *event) override; void geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry) override; void itemAdded(int index, QQuickItem *item) override; |