QML类型:MouseArea

一、描述

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

二、属性成员

1、mouseX : real

      mouseY : real

光标的坐标。坐标是相对于 MouseArea 的。

如果 hoverEnabled 属性为false:这两个属性仅在按下鼠标按键时有效,并且只要按住鼠标按键,即使光标移出区域外也将保持有效。

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

  • 未按下任何鼠标按键,但光标位于 MouseArea 内(containsMouse 为 true)。
  • 一个鼠标按键被按住,即使光标已经移出该区域。

2、acceptedButtons : Qt::MouseButtons

此属性保存鼠标区域响应的鼠标按键。默认值:Qt.LeftButton

响应多个按键:

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

响应所有按键:

MouseArea
{ 
    acceptedButtons: Qt.AllButtons 
}

3、containsMouse : bool

光标当前是否在鼠标区域内。

如果 hoverEnabled 为 false,则此属性仅在光标位于 MouseArea 内时按下鼠标时为true。

4、containsPress : bool

这是一个等同于 press && containsMouse 的便利属性,即当前是否按下了任何接受的按钮且光标当前是否在 MouseArea 内。

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

5、cursorShape : Qt::CursorShape

此鼠标区域的光标形状。默认值:Qt.ArrowCursor  QCursor

为了只为一个区域设置鼠标光标形状而不对鼠标事件做出反应,请将acceptedButtons 设置为none:

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

6、拖动组

drag.active : bool — 当前是否正在拖动目标项目。

drag.axis : enumeration — 拖动类型:

  • 水平 (Drag.XAxis)
  • 垂直 (Drag.YAxis)
  • 两者皆可 (Drag.XAndYAxis

drag.filterChildren : bool — 如果为 true,则拖动可以覆盖子项 MouseAreas。

限制目标可以沿相应轴拖动的距离:

  • drag.maximumX : real
  • drag.maximumY : real
  • drag.minimumX : real
  • drag.minimumY : real

drag.smoothed : bool :默认为 true。

  • 为 true,则在拖动操作开始后才会移动目标。
  • 为 false,则目标将直接移动到当前鼠标位置。

drag.target : Item — 指定要拖动的项目的 id。

drag.threshold : real — 拖动操作开始时的阈值(以像素为单位)。 默认情况下,这绑定到依赖于平台的值。

以下示例显示可沿 X 轴拖动的 Rectangle。 当矩形向右拖动时,它的不透明度会降低。

    Rectangle 
    {
        id: container
        width: root.width;
        height: root.height;

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

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

默认不能拖动设置了锚值的项目,例如上面加上:anchors.left:parent.left 将无法拖动。

要拖动锚设置了锚值的项目,可设置:onPressed:rect.anchors.left = undefined


以下代码设置 drag.filterChildren:false 

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

            MouseArea
            {
                anchors.fill: parent
                drag.target: rect
                drag.axis: Drag.XAxis
                drag.minimumX: 0
                drag.maximumX: container.width - rect.width
                drag.filterChildren:false
                Rectangle
                {
                    id:childrenRectangle
                    color: "blue"
                    width: 30; height: 30
                    anchors.bottom: rect.bottom
                    anchors.right: rect.right
                    MouseArea
                    {
                        anchors.fill: parent
                        onPressed: console.log("123");
                    }
                }
            }
        }
    }

点击蓝色部分不能拖动,设置drag.filterChildren:true即可覆盖子项的 MouseAreas。

7、enabled : bool

此属性保存项目是否接受鼠标事件。默认为 true。

注意:由于历史原因,该属性不等同于 Item.enabled。它只影响鼠标事件,它的影响不会传播到子项。

8、hoverEnabled : bool

此属性保存是否处理悬停事件。默认为false。

此属性影响 containsMouse 属性以及 onEnteredonExited onPositionChanged 信号。

9、pressAndHoldInterval : int

此属性会覆盖发出 pressAndHold()(长按) 之前经过的时间(以毫秒为单位)。

这个属性是在 Qt 5.9 中引入的。

10、pressed : bool

此属性保存当前是否按下了任何已接受的按钮。

11、pressedButtons : MouseButtons

此属性保存当前按下的鼠标按钮。此属性只处理acceptedButtons 中指定的按钮。

它包含以下按位组合:

  • Qt.LeftButton
  • Qt.RightButton
  • Qt.MiddleButton
Text 
{
    text: mouseArea.pressedButtons & Qt.RightButton ? "right" : ""

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

12、preventStealing : bool

鼠标事件是否被过滤。如果设置为 true,则没有项目会过滤鼠标事件。默认为 false。

13、propagateComposedEvents : bool

此属性保存组合鼠标事件是否会自动传播到与此 MouseArea 重叠但在视觉堆叠顺序中较低的其他 MouseAreas。默认为 false。

MouseArea 包含多个组合事件:clicked(单击)、doubleClicked(双击) 和 pressAndHold。这些组合事件基本鼠标事件(如鼠标按下事件)组成,并且与基本事件相比可以以不同的方式传播。

如果设置为true,则组合事件将自动传播到场景中相同位置的其他MouseAreas。每个事件都按堆叠顺序传播到它下面的下一个启用的 MouseArea,直到 MouseArea 接受该事件。与基本事件不同,如果不存在处理程序,则不会自动接受组合事件。

    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
                }
            }
        }
    }

    propagateComposedEvents: false

当希望重叠的 MouseAreas 一起处理组合事件时,此属性有很大作用。例如:如果希望一个 MouseArea 处理点击信号而另一个处理 pressAndHold,或者如果希望一个 MouseArea 处理大部分时间被点击,但在满足某些条件时过滤它。

14、scrollGestureEnabled : bool

控制此是否响应来自非鼠标设备的滚动手势,如触控板上的 2 指轻拂手势。默认为 true。

如果设置为 false,则仅当滚轮事件来自带滚轮的实际鼠标时才会发出滚轮信号,而滚动手势事件将传递到将处理它们的其他项目。

三、信号成员

1、canceled()

当鼠标事件被取消时会发出这个信号,因为另一个项目过滤了鼠标事件处理。

2、clicked(MouseEvent mouse)

单击时发出此信号。

单击定义为按下后释放,两者均在 MouseArea 内(按下、移出 MouseArea,然后移回内部并释放也被视为单击)。

鼠标参数提供有关单击的信息,包括释放单击的 x 和 y 位置,以及单击是否被按住。

3、doubleClicked(MouseEvent mouse)

当双击时发出此信号。

处理该信号时,如果参数 mouse 的 accepted 属性设置为false(默认为 true),则第二次点击会发出按下/松开/点击信号。

4、entered()

当鼠标进入鼠标区域时发出此信号。默认情况下,此信号仅在当前按下按钮时发出。

hoverEnabled 设置为 true 则即使没有按下鼠标按键也会发出此信号。

5、exited()

当鼠标离开鼠标区域时发出此信号。默认情况下,此信号仅在当前按下按钮时发出。

hoverEnabled 设置为 true 则即使没有按下鼠标按键也会发出此信号。 

6、positionChanged(MouseEvent mouse)

当鼠标位置改变时发出这个信号。

默认情况下,此信号仅在当前按下按钮时发出。

hoverEnabled 设置为 true 则即使没有按下鼠标按键也会发出此信号。 

7、pressAndHold(MouseEvent mouse)

长按(默认800毫秒,可通过 pressAndHoldInterval 设置)时会发出此信号。 

8、pressed(MouseEvent mouse)

按下时发出此信号。

9、released(MouseEvent mouse)

当有释放时发出这个信号。

10、wheel(WheelEvent wheel)

该信号是响应鼠标滚轮和触控板滚动手势发出的。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值