QML 之TapHandler (防止滑动过程中误点击)


前言

在qml中,处理用户的触摸屏点击或者鼠标点击,通常采用的方法是MouseArea,常用的方式如下:

Rectangle {
        width: 600
        height: 400
        anchors.fill: parent
        color: "lightgray"

        MouseArea
        {
            anchors.fill: parent
            onClicked:
            {
                console.log("clicked");
            }
        }
}

但当某些页面场景下,需要区分drag和clicked,或者在drag的同时防止误产生clicked等情况,从QtQuick 2.12起,qml提供了TapHandler;


一、TapHandler是什么?

我把Qt对TapHandler的说明翻译结果拿过来:

TapHandler是一种触摸屏点击或鼠标点击的处理程序。

有效点击手势的检测取决于手势策略。默认值为DragThreshold,这要求压入和释放在空间和时间上都紧密相连。在这种情况下,DragHandler只能使用被动抓取来运行,因此不会干扰到任何其他项或输入处理程序的事件传递。因此,当您希望通过添加带有绑定和/或JavaScript回调的TapHandler来修改现有控件或项的行为时,默认的gesturePolicy非常有用。

请注意,**按钮(如QPushButton)的实现通常不关心按下和释放是否发生在一起:如果按下按钮,然后改变主意,则需要将其从按钮边缘一直拖动,**以取消单击。对于这个用例,将gesturePolicy设置为TapHandler。在边界内释放。

对于多点触控手势(双击、三点触控等),移动的距离不得超过QStyleHits::mouseDoubleClickDistance()QStyleHits::touchDoubleTapDistance(),且两次触控之间的时间不得超过QStyleHits::mouseDoubleClickInterval()

二、对比MouseArea

针对特定测试场景如下:
鼠标press然后拖动一段距离,再释放。

1. MouseArea

Rectangle {
        width: 600
        height: 400
        anchors.fill: parent
        color: "lightgray"

        MouseArea
        {
            anchors.fill: parent
            onClicked:
            {
                console.log("clicked");
            }
       }
}

打印结果:

qml: clicked

2.TapHandler

引入QtQuick 2.12
代码如下(示例):

 Rectangle {
        width: 600
        height: 400
        anchors.fill: parent
        color: "lightgray"

        TapHandler {
            onPressedChanged: {
                console.log("press ? : ", pressed)
            }
            
            //长按时触发onLongPressed
            onLongPressed: {
                console.log("long pressed")
            }

            onDoubleTapped:
            {
                console.log("double pressed")
            }

            onSingleTapped:
            {
                console.log("single pressed")
            }

            onTapped:
            {
                console.log("onTapped")
            }

            onTapCountChanged:
            {
                console.log("TapCountChanged pressed")
            }
       }
 }

打印结果:

qml: press ? :  true
qml: press ? :  false

总结

TapHandler在该特殊场景环境下并没有触发onTapped或者onSingleTapped或onLongPressed等信号。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值