《Qt MOOC系列教程》第三章第六节:输入处理器

Qt Quick有多种类型可以处理触摸事件,例如我们在上一节中使用的MouseArea,另外还有PinchAreaMultiPointTouchAreaFlickable

上面这些项都存在一些问题。比如MouseArea,Qt只是假设有一个鼠标,对于QMouseEventQTouchEvent在Qt Quick中都被认为是的相同事件。这就导致您不能同时与两个MouseAreaFlickable进行交互。对于我们之前使用的MouseArea就意味着您不能同时按下两个按钮或同时拖动两个滑块。也意味着您不能同时使用PinchAreaMouseArea,因为当PinchArea处于活动状态时,它不会将事件传递给MouseArea

为了解决这些问题,Qt引入了新的输入处理器类型。输入处理器可以在任何Item类型里声明,并且可以代表父对象处理来自任何指针设备的事件。它们是非常轻量级的类型,可以被声明为每个交互类型的处理器。每个Item都可以有无限的处理器类型,所以你不会担心它们不够用。

不管是触摸事件,还是鼠标按钮事件或者组合键在活动状态,您都可以将事件处理器对哪种交互进行响应进行约束。这是通过acceptedButtonsacceptedDevices属性来实现的,可以选择被接收的Qt::MouseButtons或被接收的指针设备(如PointerDevice.Mouse, PointerDevice.Stylus或者PointerDevice.TouchScreen)。

现在,让我们通过示例来了解一些输入处理器。

1. TapHandler

TapHandlerMouseArea有几个关键的区别:

import Qt.labs.handlers 1.0

Item {
    TapHandler {
        acceptedDevices: PointerDevice.Mouse | PointerDevice.Stylus
        onTapped: console.log("left clicked")
    }
    
    TapHandler {
        acceptedDevices: PointerDevice.TouchScreen
        onTapped: console.log("tapped")
    }
    
    TapHandler {
        acceptedButtons: Qt.RightButton
        onTapped: console.log("right clicked")
    }
}

现在,我们可以接收来自特定设备的事件并做出相应的响应。也可以让多个TapHandler在同一个Item中活动,而不会出现多个MouseArea之类的问题。

2. DragHandler

DragHandlerMouseAreadrag属性类似,但更易于使用。它具有类似MouseArea中的xAxisyAxis 属性组

import Qt.labs.handlers 1.0

Rectangle {
    width: 50
    height: 50
    color: "green"
    
    DragHandler {
        yAxis.enabled: false
    }
}

在本例中,我们可以拖动Rectangle,但只能沿着X轴方向,因为我们禁用了Y轴。

3. PointHandler

还有一个PointHandler可用于跟踪触摸点:

import Qt.labs.handlers 1.0

Item {
    id: root

    PointHandler {
        id: handler
        acceptedDevices: PointerDevice.Mouse | PointerDevice.Stylus
        target: Rectangle {
            parent: root
            color: "blue"
            visible: handler.active
            x: handler.point.position.x - width / 2
            y: handler.point.position.y - height / 2
            width: 20
            height: width
            radius: width / 2
        }
    }
}

当一个press事件发生时,处理器将选择一个尚未绑定到其他处理器的点。它将检查给定的约束条件(acceptedDevices等)是否满足,是否符合该点的条件。然后它将跟踪active属性为true的点,直至释放。与其他处理器一样,它具有target属性,我们在其中放置了一个矩形并绑定了处理器属性。

Source

获取更多信息,请关注作者公众号:程序员练兵场
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值