Fix mouse inside MouseArea (containsMouse) for press event

In MouseArea, containsMouse (mouse inside MouseArea) flag is enabled for
press event irrespective of whether its accepted or not. This creates
containsMouse to be enabled always for this corresponding item leaving
no option to reset.

To fix this issue, containsMouse flag is enabled only if the press
event is accepted for mouse handler.

Fixes: QTBUG-110594
Pick-to: 6.4 6.5
Change-Id: Ibb0e89529ccebc3063330c22b8b3501b2917d78f
Reviewed-by: Shawn Rutledge <shawn.rutledge@qt.io>
This commit is contained in:
Santhosh Kumar 2023-02-08 09:54:48 +01:00 committed by Shawn Rutledge
parent 31722ff2ff
commit 2af8743aab
3 changed files with 35 additions and 1 deletions

View File

@ -1130,8 +1130,10 @@ void QQuickMouseArea::setHoverEnabled(bool h)
\qmlproperty bool QtQuick::MouseArea::containsMouse
This property holds whether the mouse is currently inside the mouse area.
\warning If hoverEnabled is false, containsMouse will only be valid
\warning If hoverEnabled is \c false, \c containsMouse will be \c true
when the mouse is pressed while the mouse cursor is inside the MouseArea.
But if you set \c {mouse.accepted = false} in an \c onPressed handler,
\c containsMouse will remain \c false because the press was rejected.
*/
bool QQuickMouseArea::hovered() const
{
@ -1241,6 +1243,8 @@ bool QQuickMouseArea::setPressed(Qt::MouseButton button, bool p, Qt::MouseEventS
if (!me.isAccepted()) {
d->pressed = Qt::NoButton;
if (!hoverEnabled())
setHovered(false);
}
if (!oldPressed) {

View File

@ -0,0 +1,15 @@
import QtQuick
Rectangle {
width: 200
height: 200
visible: true
MouseArea {
id: mouseArea
objectName: "mouseArea"
anchors.fill: parent
hoverEnabled: false
onPressed: function(mouse) { mouse.accepted = false }
}
}

View File

@ -139,6 +139,7 @@ private slots:
void negativeZStackingOrder();
void containsMouseAndVisibility();
void containsMouseAndVisibilityMasked();
void containsMouseAndHoverDisabled();
void doubleClickToHide();
void releaseFirstTouchAfterSecond();
#if QT_CONFIG(tabletevent)
@ -2508,6 +2509,20 @@ void tst_QQuickMouseArea::containsMouseAndVisibilityMasked()
QTRY_VERIFY(!mouseArea2->hovered());
}
// QTBUG-110594
void tst_QQuickMouseArea::containsMouseAndHoverDisabled()
{
QQuickView window;
QVERIFY(QQuickTest::showView(window, testFileUrl("containsMouseAndHoverDisabled.qml")));
QQuickMouseArea *mouseArea = window.rootObject()->findChild<QQuickMouseArea *>("mouseArea");
QVERIFY(mouseArea != nullptr);
QVERIFY(!mouseArea->hoverEnabled());
QTest::mousePress(&window, Qt::LeftButton, Qt::NoModifier, QPoint(100, 100));
QTRY_VERIFY(!mouseArea->hovered());
}
// QTBUG-35995 and QTBUG-102158
void tst_QQuickMouseArea::doubleClickToHide()
{