aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMitch Curtis <mitch.curtis@qt.io>2019-11-07 12:42:12 +0100
committerMitch Curtis <mitch.curtis@qt.io>2019-12-04 12:26:10 +0100
commit75b6ef710cddbf9395df35650438f0feb57ec076 (patch)
treea9efb9180d8eb86f2badc138b58fe62b9c7e7bdc /src
parent463898f0765b83f6c391f6802a0ee06796f9f6d2 (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.cpp19
-rw-r--r--src/quicktemplates2/qquicksplitview_p.h1
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;