QML鼠标事件

QML中常用的事件有:

  1. 鼠标事件
  2. 键盘事件
  3. 拖拽事件
  4. 定时器

MouseArea(鼠标区域)

 MouseArea是一个不可见的项目,同、通常用来和一个可见的项目配合使用来为其提供鼠标处理。鼠标处理的逻辑可以包含在MouseArea项目中

常用的属性:

enabled是否开启鼠标区域(默认为true)

mouseX

mouseY

保存鼠标的位置
acceptedButtons设置接收的按钮(默认为Qt.LeftButton)
hoverEnabled是否开启悬停
pressAndHoldInterval 按下并保持的间隔(以毫秒为单位)
pressed保存是否已按下
pressedButtons保存按下的按钮(左键,右键,中间键)
scrollGestureEnabled滚动手势的开启(用于非鼠标设备)
preventStealing 此属性保存鼠标事件是否可能从此鼠标区域被盗
propagateComposedEvents此属性保存组合鼠标事件是否将自动传播到与此鼠标区域重叠但在可视堆叠顺序中较低的其他鼠标区域。默认情况下,此属性为 false。

常用信号:

canceled()当鼠标事件被取消时,将发出此信号
clicked(MouseEvent mouse)当鼠标单击时发出信号
doubleClicked(MouseEvent mouse)当鼠标双击时发出信号
entered()鼠标进入鼠标区域时发出信号
exited()鼠标退出鼠标区域时发出此信号
positionChanged(MouseEvent mouse)鼠标位置改变时发出该信号
pressAndHold(MouseEvent mouse)长按(800毫秒)鼠标发出此信号
pressed(MouseEvent mouse)鼠标按下时发出信号
released(MouseEvent mouse)鼠标释放时发出信号
wheel(WheelEvent wheel)此信号是在响应鼠标滚轮和触控板滚动手势时发出的

cursorShape(光标形状)

Qt.ArrowCursor(箭头光标)Qt.BlankCursor
Qt.UpArrowCursor(向上箭头光标)Qt.SplitVCursor
Qt.CrossCursor(十字光标)Qt.SplitHCursor
Qt.WaitCursor(等待光标)Qt.PointingHandCursor
Qt.IBeamCursor(波束光标)Qt.ForbiddenCursor
Qt.SizeVerCursor(版本光标)Qt.WhatsThisCursor
Qt.SizeHorCursorQt.BusyCursor
Qt.SizeBDiagCursorQt.OpenHandCursor
Qt.SizeFDiagCursorQt.ClosedHandCursor
Qt.SizeAllCursorQt.DragCopyCursor
Qt.DragMoveCursorQt.DragLinkCursor

点击和释放:

Rectangle{
        width:100
        height: 100
        color: "red"
        MouseArea{
            anchors.fill: parent;//覆盖父类
            onPressed:  {parent.color="green"}//点击时颜色变绿
            onReleased: {parent.color="red"}//释放时颜色变红
        }
    }

点击时变绿:                                                释放时变红:

 鼠标进入和离开:

Rectangle{
        width:100
        height: 100
        color: "red"
        MouseArea{
            anchors.fill: parent;//覆盖父类
            hoverEnabled: true//开启鼠标悬停
            onEntered: {parent.color="blue"}//鼠标进入时颜色变蓝
            onExited: {parent.color="yellow"}//鼠标离开时颜色变黄
        }
    }

 鼠标进入时:                                               鼠标离开时: 

  鼠标在图形中移动:

Rectangle{
        width:100
        height: 100
        color: "red"
        MouseArea{
            anchors.fill: parent;//覆盖父类
            hoverEnabled: true//开启悬停
            onPositionChanged: {//鼠标位置改变时输出位置
                console.log("鼠标的位置:",mouseX,mouseY);//输出鼠标的位置
            }
        }
    }

输出鼠标的位置: 

 长按和双击:

Rectangle{
        width:100
        height: 100
        color: "red"
        MouseArea{
            anchors.fill: parent;//覆盖父类
            onDoubleClicked: {
                parent.color="blue"
            }
            onPressAndHold: {
                parent.color="green"
            }
        }
    }

双击:                                                      长按: 

 设置接收的键:

Rectangle{
        width:100
        height: 100
        color: "red"
        MouseArea{
            anchors.fill: parent;//覆盖父类
            acceptedButtons: Qt.LeftButton|Qt.RightButton
            onClicked: {
                if(mouse.button==Qt.LeftButton)
                {
                    console.log("鼠标左键按下")
                }
                else if(mouse.button==Qt.RightButton)
                {
                    console.log("鼠标右键按下")
                }
                else{
                    console.log("其他按键按下")
                }
            }
        }
    }

设置组合键 :

Rectangle{
        width:100
        height: 100
        color: "red"
        MouseArea{
            anchors.fill: parent;//覆盖父类
            acceptedButtons: Qt.LeftButton|Qt.RightButton
            onClicked: {
                if((mouse.button==Qt.LeftButton)&&(mouse.modifiers&Qt.ShiftModifier))
                {
                    console.log("左键和Shift键同时按下")
                }
            }

        }
    }

 设置鼠标形状:

Rectangle{
        width:100
        height: 100
        color: "red"
        MouseArea{
            anchors.fill: parent;//覆盖父类
            cursorShape:Qt.IBeamCursor
        }
    }

propagateComposedEvents(组合传播事件)

保存组合鼠标事件是否将自动传播到与此鼠标区域重叠但在可视堆叠顺序中较低的其他鼠标区域。默认情况下,此属性为 false。

如果传播复合事件设置为 true,则组合事件将自动传播到场景中同一位置的其他鼠标区域。每个事件都按堆叠顺序传播到其下方的下一个启用的 MouseArea,向下传播此可视层次结构,直到 MouseArea 接受该事件。与事件不同,如果不存在处理程序,则不会自动接受组合事件

 简单的讲就是控件有重复时,点击上层是否会往下执行。

当不开起组合事件传播时:

Rectangle{
        width:100
        height: 100
        color: "red"
        MouseArea{
            anchors.fill: parent;//覆盖父类
            onClicked: {console.log("clicked red")}
        }
        Rectangle{
            color: "blue"
            width: 50
            height: 50
            x:25
            y:25
            MouseArea{
                anchors.fill: parent
                //propagateComposedEvents: true//设置传播事件为true
                onClicked: {
                    console.log("clicked blue")
                    mouse.accepted=false
                }
            }
        }
    }

点击红色区域:                                                         点击蓝色区域

 由此可见,上层执行完并不会往下层运行。

开启组合传播事件:

Rectangle{
        width:100
        height: 100
        color: "red"
        MouseArea{
            anchors.fill: parent;//覆盖父类
            onClicked: {console.log("clicked red")}
        }
        Rectangle{
            color: "blue"
            width: 50
            height: 50
            x:25
            y:25
            MouseArea{
                anchors.fill: parent
                propagateComposedEvents: true//设置传播事件为true
                onClicked: {
                    console.log("clicked blue")
                    mouse.accepted=false
                }
            }
        }
    }

 点击红色区域:                                            点击蓝色区域:

 由此可见,上层的执行完会往下层执行。

鼠标拖拽:

drag.active拖拽活动
drag.target拖动目标
drag.axis

拖动轴

Drag.XAxis    水平

Drag.YAxis     竖直

Drag.XAndYAxis    水平和竖直

drag.filterChildren拖动的filter子项
drag.maximumX拖动最大的X
drag.maximumY拖动最大的Y
drag.minimumX拖动最小的X
drag.minimumY拖动最小的Y
drag.smoothed拖动平滑
drag.threshold拖动阈值

 使用流程:

  • drag.target 设置拖动目标
  • drag.active 指定当前是否正在拖动目标项
  • drag.axis  指定拖动是可以水平 ()、垂直 () 还是两者

拖动矩形:

Rectangle{
        id:rect1
        width:100
        height: 100
        color: "red"
        MouseArea{
            anchors.fill: parent;//覆盖父类
            drag.target: rect1 //指定拖动目标
            drag.axis: Drag.Drag.XAndYAxis //水平和垂直都能拖动
            drag.minimumX:0//设置最小X位置
            drag.minimumY: 0//设置最小Y位置
        }
    }

添加子对象:

Rectangle {
        width: 480
        height: 320
        Rectangle {
            id:rect1
            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
                        drag.target: parent;
                        drag.axis: "XAxis"
                    }
                }
            }
        }
    }

 

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值