鼠标事件

在Qt Quick中处理鼠标事件

处理来自所有指向设备(包括鼠标和触摸屏)事件的更现代方式是通过输入处理器。本页描述了最初的Qt Quick MouseArea类型,它最初设计用于处理鼠标输入,后来开始在简单的面向触摸的用户界面中处理单点触摸事件(以合成鼠标事件的形式)。

鼠标类型

鼠标事件处理

QML 使用信号和处理器来传递鼠标交互。具体来说,Qt Quick 提供了 MouseAreaMouseEvent 类型,允许开发者定义 JavaScript 回调(也称为信号处理器),这些回调在定义的区域内接受鼠标事件。

定义一个鼠标区域

MouseArea 类型在定义的区域内接收事件。定义此区域的一种快速方法是使用 anchors.fill 属性将 MouseArea 锚定到其父区域的区域。如果父级是 Rectangle(或任何 Item 组件),则 MouseArea 将填充由父级尺寸定义的区域。或者,可以定义比父级更小或更大的区域。

Rectangle {
    id: button
    width: 100; height: 100

    MouseArea {
        anchors.fill: parent
        onClicked: console.log("button clicked")
    }
    MouseArea {
        width:150; height: 75
        onClicked: console.log("irregular area clicked")
    }
}

接收事件

MouseArea 类型会响应不同的鼠标事件发出信号。MouseArea 类型文档更详细地描述了这些手势:

  • 已取消

  • 点击

  • 双击

  • 已输入

  • 已退出

  • 位置已更改

  • 按下并保持

  • 按下

  • 已发布

这些信号可以有回调函数,当信号被发出时,这些回调函数会被调用。

MouseArea {
    anchors.fill: parent
    onClicked: console.log("area clicked")
    onDoubleClicked: console.log("area double clicked")
    onEntered: console.log("mouse entered the area")
    onExited: console.log("mouse left the area")
}

启用手势

某些鼠标手势和按钮点击需要在发送或接收事件之前启用。某些MouseAreaMouseEvent属性启用了这些手势。

要监听(或明确忽略)某个鼠标按钮,请将适当的鼠标按钮设置为acceptedButtons属性。

自然地,鼠标事件,如按钮按下和鼠标位置,在鼠标点击期间发送。例如,containsMouse属性仅在鼠标按下期间获取其正确值。hoverEnabled将启用鼠标事件和定位,即使没有鼠标按钮按下。将hoverEnabled属性设置为true,反过来将启用enteredexitedpositionChanged信号及其各自的信号处理程序。

MouseArea {
    hoverEnabled: true
    acceptedButtons: Qt.LeftButton | Qt.RightButton
    onEntered: console.log("mouse entered the area")
    onExited: console.log("mouse left the area")
}

此外,要禁用整个鼠标区域,将MouseAreaenabled属性设置为false

MouseEvent 对象

信号及其回调接收一个MouseEvent对象作为参数。mouse对象包含有关鼠标事件的信息。例如,通过mouse.button属性查询启动事件的鼠标按钮。

MouseEvent 对象也可以使用其 accepted 属性忽略鼠标事件。

接受更多信号

许多信号被多次发送以反映各种鼠标事件,例如双击。为了便于分类鼠标点击,MouseEvent对象有一个accepted属性来禁用事件传播。

要了解更多关于QML事件系统的信息,请阅读信号和处理器,以及事件系统文档。