Qt Quick有多种类型可以处理触摸事件,例如我们在上一节中使用的MouseArea
,另外还有PinchArea
、MultiPointTouchArea
和Flickable
。
上面这些项都存在一些问题。比如MouseArea
,Qt只是假设有一个鼠标,对于QMouseEvent
和QTouchEvent
在Qt Quick中都被认为是的相同事件。这就导致您不能同时与两个MouseArea
或Flickable
进行交互。对于我们之前使用的MouseArea
就意味着您不能同时按下两个按钮或同时拖动两个滑块。也意味着您不能同时使用PinchArea
和MouseArea
,因为当PinchArea
处于活动状态时,它不会将事件传递给MouseArea
。
为了解决这些问题,Qt引入了新的输入处理器类型。输入处理器可以在任何Item
类型里声明,并且可以代表父对象处理来自任何指针设备的事件。它们是非常轻量级的类型,可以被声明为每个交互类型的处理器。每个Item
都可以有无限的处理器类型,所以你不会担心它们不够用。
不管是触摸事件,还是鼠标按钮事件或者组合键在活动状态,您都可以将事件处理器对哪种交互进行响应进行约束。这是通过acceptedButtons
和acceptedDevices
属性来实现的,可以选择被接收的Qt::MouseButtons
或被接收的指针设备(如PointerDevice.Mouse
, PointerDevice.Stylus
或者PointerDevice.TouchScreen
)。
现在,让我们通过示例来了解一些输入处理器。
1. TapHandler
TapHandler
与MouseArea
有几个关键的区别:
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
DragHandler
与MouseArea
的drag
属性类似,但更易于使用。它具有类似MouseArea
中的xAxis
和yAxis
属性组:
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
属性,我们在其中放置了一个矩形并绑定了处理器属性。
获取更多信息,请关注作者公众号:程序员练兵场