鼠标事件#

在Qt Quick中处理鼠标事件

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

鼠标类型#

鼠标事件处理#

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

定义鼠标区域#

MouseArea 类型在定义区域接收事件。一种快速定义此区域的方法是将 MouseArea 通过 anchors.fill 属性锚定到其父级的区域。如果父级是 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 事件系统的信息,请阅读信号和处理器以及事件系统文档。