MouseArea: don't override preventStealing on mouse release
In setPreventStealing() we call setKeepMouseGrab(); so it does not make sense to override setKeepMouseGrab() in other places without even checking the state of the preventStealing property. Pick-to: 5.15 6.2 6.3 Fixes: QTBUG-103522 Change-Id: Ib4a2b01b814835715642aec83fac0a84debe2461 Reviewed-by: Richard Moe Gustavsen <richard.gustavsen@qt.io> Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
This commit is contained in:
parent
cc28d9d2a7
commit
d92f1dfe05
|
@ -808,7 +808,8 @@ void QQuickMouseArea::mouseReleaseEvent(QMouseEvent *event)
|
||||||
QQuickWindow *w = window();
|
QQuickWindow *w = window();
|
||||||
if (w && w->mouseGrabberItem() == this)
|
if (w && w->mouseGrabberItem() == this)
|
||||||
ungrabMouse();
|
ungrabMouse();
|
||||||
setKeepMouseGrab(false);
|
if (!d->preventStealing)
|
||||||
|
setKeepMouseGrab(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
d->doubleClick = false;
|
d->doubleClick = false;
|
||||||
|
|
|
@ -0,0 +1,31 @@
|
||||||
|
import QtQuick 2.15
|
||||||
|
|
||||||
|
ListView {
|
||||||
|
id: flick
|
||||||
|
width: 640
|
||||||
|
height: 480
|
||||||
|
model: 100
|
||||||
|
|
||||||
|
delegate: Rectangle {
|
||||||
|
border.color: "#81e889"
|
||||||
|
width: 640; height: 100
|
||||||
|
Text { text: "Row " + index }
|
||||||
|
}
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
anchors.right: parent.right
|
||||||
|
anchors.margins: 2
|
||||||
|
color: ma.pressed ? "#81e889" : "#c2f4c6"
|
||||||
|
width: 50; height: 50
|
||||||
|
radius: 5
|
||||||
|
MouseArea {
|
||||||
|
id: ma
|
||||||
|
anchors.fill: parent
|
||||||
|
preventStealing: true
|
||||||
|
drag {
|
||||||
|
target: parent
|
||||||
|
axis: Drag.YAxis
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -125,6 +125,7 @@ private slots:
|
||||||
void invalidClick();
|
void invalidClick();
|
||||||
void pressedOrdering();
|
void pressedOrdering();
|
||||||
void preventStealing();
|
void preventStealing();
|
||||||
|
void preventStealingListViewChild();
|
||||||
void clickThrough();
|
void clickThrough();
|
||||||
void hoverPosition();
|
void hoverPosition();
|
||||||
void hoverPropagation();
|
void hoverPropagation();
|
||||||
|
@ -1108,6 +1109,36 @@ void tst_QQuickMouseArea::preventStealing()
|
||||||
QTest::mouseRelease(&window, Qt::LeftButton, Qt::NoModifier, p);
|
QTest::mouseRelease(&window, Qt::LeftButton, Qt::NoModifier, p);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// QTBUG-103522
|
||||||
|
void tst_QQuickMouseArea::preventStealingListViewChild()
|
||||||
|
{
|
||||||
|
QQuickView window;
|
||||||
|
QVERIFY(QQuickTest::showView(window, testFileUrl("preventStealingListViewChild.qml")));
|
||||||
|
QQuickFlickable *flickable = qobject_cast<QQuickFlickable*>(window.rootObject());
|
||||||
|
QVERIFY(flickable);
|
||||||
|
QQuickMouseArea *mouseArea = flickable->findChild<QQuickMouseArea*>();
|
||||||
|
QVERIFY(mouseArea);
|
||||||
|
QPoint p = mouseArea->mapToScene(mouseArea->boundingRect().center()).toPoint();
|
||||||
|
const int threshold = qApp->styleHints()->startDragDistance();
|
||||||
|
|
||||||
|
flickable->flick(0, -10000);
|
||||||
|
for (int i = 0; i < 2; ++i) {
|
||||||
|
QVERIFY(flickable->isMovingVertically());
|
||||||
|
QTest::touchEvent(&window, device).press(0, p);
|
||||||
|
QQuickTouchUtils::flush(&window);
|
||||||
|
for (int j = 0; j < 4 && !mouseArea->drag()->active(); ++j) {
|
||||||
|
p += QPoint(0, threshold);
|
||||||
|
QTest::touchEvent(&window, device).move(0, p);
|
||||||
|
QQuickTouchUtils::flush(&window);
|
||||||
|
}
|
||||||
|
// MouseArea should be dragged because of preventStealing; ListView does not steal the grab.
|
||||||
|
QVERIFY(mouseArea->drag()->active());
|
||||||
|
QCOMPARE(flickable->isDragging(), false);
|
||||||
|
QTest::touchEvent(&window, device).release(0, p);
|
||||||
|
QCOMPARE(mouseArea->drag()->active(), false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void tst_QQuickMouseArea::clickThrough()
|
void tst_QQuickMouseArea::clickThrough()
|
||||||
{
|
{
|
||||||
// timestamp delay to avoid generating a double click
|
// timestamp delay to avoid generating a double click
|
||||||
|
|
Loading…
Reference in New Issue