鼠标区域 QML 类型

启用简单的鼠标处理。 更多...

导入声明import QtQuick
继承

Item

属性

信号

详细描述

MouseArea是一种不可见项,通常与可见项一起使用,以便为该项提供鼠标处理。通过有效地充当代理,鼠标处理逻辑可以包含在MouseArea项内。

enabled属性用于启用和禁用代理项的鼠标处理。当禁用时,鼠标区域对鼠标事件变得透明。

MouseArea是不可见项,但它有可见属性。当设置为false时,鼠标区域对鼠标事件变得透明。

pressed只读属性表示用户是否在鼠标区域上按下了鼠标按钮。该属性常用于用户界面中属性之间的绑定。该containsMouse只读属性表示鼠标光标是否在鼠标区域内,但默认情况下,仅在鼠标按钮按下时;有关详细信息,请参阅containsMouse文档。

通过定义事件处理程序属性提供的信号提供了有关鼠标位置和按钮点击的信息。最常用的是处理鼠标按下和点击:onClicked、onDoubleClicked、onPressed、onReleased和onPressAndHold。还可能通过onWheel信号处理鼠标滚轮事件。

如果一个MouseArea与其他MouseArea项的重叠区域,可以通过将propagateComposedEvents设置为true并拒绝要传递的事件,将这些事件的clickeddoubleClickedpressAndHold传递给这些其他项。有关详细信息,请参阅propagateComposedEvents文档。

默认情况下,MouseArea项只报告鼠标点击,而不报告鼠标光标位置的变化。设置hoverEnabled属性确保使用onPositionChanged、onEntered和onExited定义的处理程序,并且即使在没有鼠标按钮按下时,也会更新containsMouse属性。

示例用法

以下示例使用Rectange中的MouseArea,在点击时将Rectange颜色更改为红色

import QtQuick

Rectangle {
    width: 100; height: 100
    color: "green"

    MouseArea {
        anchors.fill: parent
        onClicked: { parent.color = 'red' }
    }
}

许多MouseArea信号包含一个含mouseover参数,该参数包含有关鼠标事件的附加信息,例如位置、按钮和任何键修饰符。

以下是对上一例的扩展,当区域被右键点击时产生不同的颜色

Rectangle {
    width: 100; height: 100
    color: "green"

    MouseArea {
        anchors.fill: parent
        acceptedButtons: Qt.LeftButton | Qt.RightButton
        onClicked: (mouse)=> {
            if (mouse.button == Qt.RightButton)
                parent.color = 'blue';
            else
                parent.color = 'red';
        }
    }
}

也请参阅MouseEventMouseArea示例Qt Quick中用户输入的重要概念

属性文档

mouseX : real [只读]

mouseY : real [只读]

这些属性保存鼠标光标的坐标。

如果hoverEnabled属性为false,则这些属性只有在按钮按下时才有效,并且即使鼠标移出区域,按钮按下的状态也会保持。

默认情况下,此属性为false。

如果hoverEnabled为true,则这些属性在以下情况下有效

  • 没有按钮按下,但鼠标在MouseArea内(containsMouse为true)。
  • 即使按钮已经移出该区域,按下并持有按钮仍然有效。

坐标相对于MouseArea


acceptedButtons : Qt::MouseButtons

此属性包含鼠标区域对哪些鼠标按钮做出响应。

要指定MouseArea将对多个按钮做出响应,请使用“|” (或)运算符组合Qt::MouseButtons的标志值

MouseArea { acceptedButtons: Qt.LeftButton | Qt.RightButton }

要指示接受所有可能设置的鼠标按钮,可以使用特殊值'Qt.AllButtons'

MouseArea { acceptedButtons: Qt.AllButtons }

默认值是Qt.LeftButton


containsMouse : bool [只读]

此属性指示鼠标是否当前位于鼠标区域内部。

注意: 如果hoverEnabled设置为false,当鼠标键在MouseArea以内被按下时,containsMouse将为true。但是,如果您在onPressed处理程序中将mouse.accepted = false设置为,由于按下了拒绝,containsMouse将保持false


containsPress : bool [只读]

这是一个方便属性,等价于pressed && containsMouse,即它表示是否按下acceptedButtons中的任何一个按钮,并且鼠标当前在MouseArea内部。

该属性在鼠标在项目边界内按下时突出显示项目特别有用。

另请参阅 pressedcontainsMouse


cursorShape : Qt::CursorShape

此属性包含此鼠标区域的指针形状。注意,在那些不显示鼠标光标的平台上,这可能没有效果。

可用的指针形状有

  • Qt.ArrowCursor
  • Qt.UpArrowCursor
  • Qt.CrossCursor
  • Qt.WaitCursor
  • Qt.IBeamCursor
  • Qt.SizeVerCursor
  • Qt.SizeHorCursor
  • Qt.SizeBDiagCursor
  • Qt.SizeFDiagCursor
  • Qt.SizeAllCursor
  • Qt.BlankCursor
  • Qt.SplitVCursor
  • Qt.SplitHCursor
  • Qt.PointingHandCursor
  • Qt.ForbiddenCursor
  • Qt.WhatsThisCursor
  • Qt.BusyCursor
  • Qt.OpenHandCursor
  • Qt.ClosedHandCursor
  • Qt.DragCopyCursor
  • Qt.DragMoveCursor
  • Qt.DragLinkCursor

要仅在某个区域设置鼠标指针形状而不应对鼠标事件做出响应,请将acceptedButtons设置为无

MouseArea { cursorShape: Qt.IBeamCursor; acceptedButtons: Qt.NoButton }

默认值是Qt.ArrowCursor

另请参阅 Qt::CursorShape


拖动组

drag.active : bool [只读]

drag.axis : 枚举

drag.filterChildren : bool

drag.maximumX : real

drag.maximumY : real

drag.minimumX : real

drag.minimumY : real

drag.smoothed : bool

drag.target : Item

drag.threshold : 实数

drag 提供了一种方便的方式来使项目可拖动。

  • drag.target 指定要拖动的项目的 id。
  • drag.active 指定目标项目是否正在被拖动。
  • drag.axis 指定是否可以进行水平 (Drag.XAxis)、垂直 (Drag.YAxis) 或两者都 (Drag.XAndYAxis) 拖动。
  • drag.minimumdrag.maximum 限制了目标可以沿相应轴移动的最大距离。

以下示例显示了一个可以沿 X 轴拖动的 矩形。当矩形被拖动到右侧时,其不透明度会降低。

Rectangle {
    id: container
    width: 600; height: 200

    Rectangle {
        id: rect
        width: 50; height: 50
        color: "red"
        opacity: (600.0 - rect.x) / 600

        MouseArea {
            anchors.fill: parent
            drag.target: rect
            drag.axis: Drag.XAxis
            drag.minimumX: 0
            drag.maximumX: container.width - rect.width
        }
    }
}

注意:如果项目为请求的 drag.axis 锚定,则无法进行拖动。例如,如果在上面的示例中将 rectanchors.leftanchors.right 设置为,则不能沿 X 轴拖动。可以在 onPressed 处理器中设置锚点值为 undefined 来避免这种情况。

如果将 drag.filterChildren 设置为 true,则拖动可以覆盖子 MouseArea。这可以使父 MouseArea 处理拖动,例如,当子项处理点击时。

import QtQuick

Rectangle {
    width: 480
    height: 320
    Rectangle {
        x: 30; y: 30
        width: 300; height: 240
        color: "lightsteelblue"

        MouseArea {
            anchors.fill: parent
            drag.target: parent;
            drag.axis: "XAxis"
            drag.minimumX: 30
            drag.maximumX: 150
            drag.filterChildren: true

            Rectangle {
                color: "yellow"
                x: 50; y : 50
                width: 100; height: 100
                MouseArea {
                    anchors.fill: parent
                    onClicked: console.log("Clicked")
                }
            }
        }
    }
}

drag.threshold 确定拖动操作开始时的像素阈值。默认情况下,它与平台相关的值绑定。此属性是在 Qt Quick 2.2 中添加的。

如果 drag.smoothed 设置为 true,则在拖动操作开始后才会移动目标。如果设置为 false,则目标将直接移动到当前鼠标位置。默认情况下,此属性为 true。此属性是在 Qt Quick 2.4 中添加的。

有关创建拖放操作的示例,请参阅 Drag 附加属性和 DropArea


enabled : 布尔型

此属性保存是否接受鼠标事件。

注意:由于历史原因,此属性不等于 Item.enabled。它仅影响鼠标事件,并且其影响不会传播到子项。

默认情况下,此属性为 true。


hoverEnabled : 布尔型

此属性保存是否处理悬停事件。

默认情况下,只有在按钮事件响应或按按钮时才会处理鼠标事件。悬停启用在没按任何鼠标按钮的情况下也能处理所有鼠标事件。

此属性影响 containsMouse 属性以及 onEntered、onExited 和 onPositionChanged 信号。


pressAndHoldInterval : 整型

此属性覆盖在发出 pressAndHold 之前毫秒级的已过时间。

如果没有显式设置 – 或在重置后 – 则值遵循 QStyleHints::mousePressAndHoldInterval

通常,可以通过使用应用程序样式提示全局设置此属性就足够了。应在需要为某些 MouseArea 修改间隔时使用此属性。

另请参阅pressAndHold


pressed : 布尔型 [只读]

此属性保存是否按下了 acceptedButtons 中的任何按钮。


pressedButtons : MouseButtons [只读]

该属性包含当前按下的鼠标按钮。

它包含以下位运算组合

  • Qt.LeftButton
  • Qt.RightButton
  • Qt.MiddleButton

以下代码在右键被按下时显示“right”

Text {
    text: mouseArea.pressedButtons & Qt.RightButton ? "right" : ""
    horizontalAlignment: Text.AlignHCenter
    verticalAlignment: Text.AlignVCenter

    MouseArea {
        id: mouseArea
        anchors.fill: parent
        acceptedButtons: Qt.LeftButton | Qt.RightButton
    }
}

注意:此属性仅处理在acceptedButtons中指定的按钮。

另请参阅:acceptedButtons


preventStealing : bool

该属性表示是否可以从此 MouseArea 中窃取鼠标事件。

如果 MouseArea 被放置在一个项内,该项过滤子鼠标事件,例如 Flickable,如果父项识别某种手势(例如滑动手势),则可能从 MouseArea 中窃取鼠标事件。如果将 preventStealing 设置为 true,则没有任何项将窃取鼠标事件。

请注意,一旦一个项开始窃取事件,将 preventStealing 设置为 true 将不会有任何效果,直到下一个按事件。

默认情况下,此属性为 false。


propagateComposedEvents : bool

该属性表示组合鼠标事件是否将自动传播到与该 MouseArea 在同一位置但不在其视觉堆叠顺序中较低的“MouseArea”中。默认情况下,此属性为 false。

MouseArea 包含几个组合事件:clickeddoubleClickedpressAndHold。这些事件由基本鼠标事件(如 pressed)组合而成,与基本事件相比,其传播方式可能不同。

将 propagateComposedEvents 设置为 true 后,组合事件将自动传播到同一场景中同一位置的其它 MouseArea 中。每个事件都将传播到其下视觉堆叠顺序中下一个 enabledMouseArea 中,直到 MouseArea 接受事件。与 pressed 事件不同,如果没有处理器,则组合事件不会自动接受。

例如,以下是一个包含蓝色 Rectangle 的黄色 Rectangle。蓝色矩形是视觉堆叠顺序中层次结构中的最顶层项;它将视觉上渲染在黄色矩形上方。由于蓝色矩形将 propagateComposedEvents 设置为 true,并将所有接收到的 clicked 事件MouseEvent::accepted 设置为 false,因此它收到的任何 clicked 事件都会传播到其下方的黄色矩形的 MouseArea

import QtQuick 2.0

Rectangle {
    color: "yellow"
    width: 100; height: 100

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

    Rectangle {
        color: "blue"
        width: 50; height: 50

        MouseArea {
            anchors.fill: parent
            propagateComposedEvents: true
            onClicked: (mouse)=> {
                console.log("clicked blue")
                mouse.accepted = false
            }
        }
    }
}

在蓝色矩形上单击将调用其子 MouseAreaonClicked 处理器;然后事件将传播到 MouseArea,引起其自己的 onClicked 处理器的调用。

此属性大大简化了您想要重叠的鼠标区域处理组合事件时的使用场景。例如:如果您想一个 MouseArea 处理 clicked 信号,而另一个处理 pressAndHold,或者如果想让一个 MouseArea 在大多数情况下处理 clicked,但在满足某些条件时将其传递。


scrollGestureEnabled : bool

此属性控制此MouseArea是否响应来自非鼠标设备(如触摸板的二指拂动手势)的滚动手势。如果设置为false,则只有当轮事件来自具有滚轮的实际鼠标时,才会发送wheel信号,而滚动手势将传递到任何其他将处理它们的Item。例如,用户可能在进行拂动手势时,鼠标指针位于包含MouseArea的项之上,从而意图与下面的Flickable进行交互。将此属性设置为false将允许PinchArea处理鼠标滚轮或捏合手势,而Flickable处理拂动手势。

默认情况下,此属性为 true。


信号文档

已取消()

当鼠标事件已取消时(因为另一个项偷走了鼠标事件处理),发出此信号。

此信号适用于高级使用:当有多个处理输入的MouseArea,或者当有一个MouseArea位于Flickable内部时,很有用。在后一种情况下,如果你在onPressed信号处理程序中执行某些逻辑,然后开始拖动,Flickable将获取从MouseArea的鼠标处理。在这些情况下,要重置MouseArea失去鼠标处理(给Flickable)的逻辑,除了处理released之外,还应该处理canceled

注意:相应的处理器是onCanceled


clicked(MouseEvent mouse)

当有单击时,发出此信号。单击是指按下然后释放,两个动作都在MouseArea内部(在MouseArea内按下,移动到外面,然后返回并释放,也视为单击)。

mouse参数提供了有关单击的信息,包括单击释放时的x和y位置以及是否按下。

处理此信号时,更改mouse参数的accepted属性没有效果,除非propagateComposedEvents属性设置为true

注意:相应的处理器是onClicked


doubleClicked(MouseEvent mouse)

当有双击(压下然后释放,然后再次压下)时,发出此信号。mouse参数提供了有关单击的信息,包括单击释放时的x和y位置以及是否按下。

处理此信号时,如果mouse参数的accepted属性设置为false,将发出对于第二次单击的pressed/released/clicked信号;否则它们会被抑制。accepted属性的默认值为true。

注意:相应的处理器是onDoubleClicked


进入()

当鼠标进入鼠标区域时,发出此信号。

默认情况下,此信号仅在当前有按钮按下时发出。将hoverEnabled设置为true,即使没有鼠标按钮按下,也会发出此信号。

注意:相应的处理器是onEntered

另请参阅:hoverEnabled


退出()

当鼠标退出鼠标区域时,发出此信号。

默认情况下,此信号仅在当前有按钮按下时发出。将hoverEnabled设置为true,即使没有鼠标按钮按下,也会发出此信号。

以下示例展示了两个MouseArea之间的典型关系,其中mouseArea2位于mouseArea1的上方。将鼠标从mouseArea1移动到mouseArea2将导致mouseArea1发出exited信号。

Rectangle {
    width: 400; height: 400
    MouseArea {
        id: mouseArea1
        anchors.fill: parent
        hoverEnabled: true
    }
    MouseArea {
        id: mouseArea2
        width: 100; height: 100
        anchors.centerIn: parent
        hoverEnabled: true
    }
}

如果您给这两个MouseArea赋予父子关系,则将鼠标从mouseArea1移动到mouseArea2不会导致mouseArea1发出exited信号。相反,它们将被视为同时悬停。

注意:相应的事件处理器为onExited

另请参阅:hoverEnabled


positionChanged(MouseEvent mouse)

当鼠标位置发生变化时,将发出此信号。

mouse参数提供了有关鼠标的信息,包括x和y位置,以及当前按下的任何按钮。

默认情况下,此信号仅在当前有按钮按下时发出。将hoverEnabled设置为true,即使没有鼠标按钮按下,也会发出此信号。

处理此信号时,更改accepted属性对mouse参数没有影响。

注意:相应的事件处理器为onPositionChanged


pressAndHold(MouseEvent mouse)

在持续按下(目前为800ms)时,将发出此信号。mouse参数提供了有关按下的信息,包括按下的x和y位置以及按下的哪个按钮。

处理此信号时,更改mouse参数的accepted属性没有效果,除非propagateComposedEvents属性设置为true

注意:相应的事件处理器为onPressAndHold


pressed(MouseEvent mouse)

在按下时,将发出此信号。mouse参数提供了有关按下的信息,包括按下的x和y位置以及按下的哪个按钮。

处理此信号时,使用mouse参数的accepted属性来控制是否接受此MouseArea的按下以及未来的所有鼠标事件,直到释放。默认情况下,接受事件并阻止此下面的其他MouseArea处理事件。如果accepted设置为false,则在按钮下一次按下之前不会向此MouseArea发送任何事件。

注意:相应的事件处理器为onPressed


released(MouseEvent mouse)

在释放时,将发出此信号。mouse参数提供了有关点击的信息,包括点击的释放的x和y位置,以及是否按住。

处理此信号时,更改accepted属性对mouse参数没有影响。

注意:相应的事件处理器为onReleased

另请参阅:canceled


wheel(WheelEvent wheel)

当响应鼠标滚轮和_trackpad_滚动手势时将发出此信号。

wheel参数提供了有关事件的信息,包括x和y位置,当前按下的任何按钮,以及有关滚轮移动的信息,包括angleDelta和pixelDelta。

注意:相应的事件处理器为onWheel


© 2024 Qt公司有限公司。本文件中包含的文档贡献的版权属于各自的所有者。提供的文档在自由软件基金会的公布下,根据GNU自由文档许可证版本1.3的条款进行许可。Qt及其相关标志是芬兰以及全球其他地区的Qt公司有限公司的商标。所有其他商标均属于各自的所有者。