aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJ-P Nurmi <jpnurmi@qt.io>2016-10-15 09:34:11 +0200
committerJ-P Nurmi <jpnurmi@qt.io>2016-10-17 09:53:25 +0000
commited7521d27cbba69196870005c9d97129a6d7b781 (patch)
tree725f6b3c253a51873547af384eba6a4246527af7
parentb32cd6480c332ca14e472d7e164914c7d3f7aaa5 (diff)
Clear hover when moved outside while pressing
As noticed in QTBUG-56269, QEvent::HoverLeave is not sent while there is an active mouse grabber item. Therefore we must hit test move events to figure out if the control is still effectively hovered. Task-number: QTBUG-56556 Change-Id: I8a5e3dbd77375aace7fc5594e4315288304d852f Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
-rw-r--r--src/quicktemplates2/qquickcontrol.cpp9
-rw-r--r--src/quicktemplates2/qquickcontrol_p.h1
-rw-r--r--tests/auto/controls/data/tst_control.qml21
3 files changed, 29 insertions, 2 deletions
diff --git a/src/quicktemplates2/qquickcontrol.cpp b/src/quicktemplates2/qquickcontrol.cpp
index 307227a6..f18483e7 100644
--- a/src/quicktemplates2/qquickcontrol.cpp
+++ b/src/quicktemplates2/qquickcontrol.cpp
@@ -1132,6 +1132,13 @@ void QQuickControl::hoverEnterEvent(QHoverEvent *event)
event->setAccepted(d->hoverEnabled);
}
+void QQuickControl::hoverMoveEvent(QHoverEvent *event)
+{
+ Q_D(QQuickControl);
+ setHovered(d->hoverEnabled && contains(event->pos()));
+ event->setAccepted(d->hoverEnabled);
+}
+
void QQuickControl::hoverLeaveEvent(QHoverEvent *event)
{
Q_D(QQuickControl);
@@ -1150,6 +1157,8 @@ void QQuickControl::mousePressEvent(QMouseEvent *event)
void QQuickControl::mouseMoveEvent(QMouseEvent *event)
{
+ Q_D(QQuickControl);
+ setHovered(d->hoverEnabled && contains(event->pos()));
event->accept();
}
diff --git a/src/quicktemplates2/qquickcontrol_p.h b/src/quicktemplates2/qquickcontrol_p.h
index 9027743a..d9827017 100644
--- a/src/quicktemplates2/qquickcontrol_p.h
+++ b/src/quicktemplates2/qquickcontrol_p.h
@@ -176,6 +176,7 @@ protected:
void focusInEvent(QFocusEvent *event) override;
void focusOutEvent(QFocusEvent *event) override;
void hoverEnterEvent(QHoverEvent *event) override;
+ void hoverMoveEvent(QHoverEvent *event) override;
void hoverLeaveEvent(QHoverEvent *event) override;
void mousePressEvent(QMouseEvent *event) override;
void mouseMoveEvent(QMouseEvent *event) override;
diff --git a/tests/auto/controls/data/tst_control.qml b/tests/auto/controls/data/tst_control.qml
index 9ecbed93..3018498e 100644
--- a/tests/auto/controls/data/tst_control.qml
+++ b/tests/auto/controls/data/tst_control.qml
@@ -847,8 +847,15 @@ TestCase {
compare(control.mirroredspy_5.count, 1)
}
- function test_hover() {
- var control = component.createObject(testCase, {width: 100, height: 100})
+ function test_hover_data() {
+ return [
+ { tag: "normal", target: component, pressed: false },
+ { tag: "pressed", target: button, pressed: true }
+ ]
+ }
+
+ function test_hover(data) {
+ var control = data.target.createObject(testCase, {width: 100, height: 100})
verify(control)
compare(control.hovered, false)
@@ -862,9 +869,19 @@ TestCase {
mouseMove(control, control.width / 2, control.height / 2)
compare(control.hovered, true)
+ if (data.pressed) {
+ mousePress(control, control.width / 2, control.height / 2)
+ compare(control.hovered, true)
+ }
+
mouseMove(control, -10, -10)
compare(control.hovered, false)
+ if (data.pressed) {
+ mouseRelease(control, -10, control.height / 2)
+ compare(control.hovered, false)
+ }
+
mouseMove(control, control.width / 2, control.height / 2)
compare(control.hovered, true)