qml学习笔记(七):输入元素鼠标输入MouseArea和键盘输入Keys

来源:互联网 发布:diy视频制作软件 编辑:程序博客网 时间:2024/06/03 21:57

原博主博客地址:http://blog.csdn.net/qq21497936
本文章博客地址:http://blog.csdn.net/qq21497936/article/details/78552121

qml学习笔记():输入元素鼠标输入MouseArea和键盘输入Keys


前话

        本章节笔记开始进入qml用户输入元素的介绍和学习,本篇章主要学习鼠标捕捉MouseArea和键盘捕捉Keys。

MouseArea

描述

        该元素主要是指定一个可以鼠标交互的区域,本身不可见,所以必须与可视化元素联合起来一起使用,一般是当作可视化区域的子对象存在。

拓展mouseEvent

        MouseEvent 是鼠标事件参数,其button 属性保存了被按下的鼠标按键标记, x、y 属性保存鼠标指针位置。还有一个比较重要的属性accepted ,如果你处理鼠标事件后不想这个事件再往下传递,就置其值为 true 。

属性

  • acceptedButtons : Qt::MouseButtons [能接受的鼠标事件]
  • containsMouse : bool [只读][鼠标是否在区域中按下,必须可接受的鼠标事件点击pressed后才会true,松开恢复false]
  • cursorShape : Qt::CursorShape [鼠标在区域中显示的图标,很多种图标]

隐藏鼠标并屏蔽事件

Rectangle {    width: 200;    height: 200;    color: "gray";    MouseArea {        anchors.fill: parent;        id: mouse;        cursorShape: Qt.IBeamCursor;    }}

  • drag [拖动类别]
  • drag.target : Item [指定拖动的目标对象id]
  • drag.active : bool [目标对象是否正在被拖动]
  • drag.axis : enumeration [拖动方式,横轴、纵轴或者两者都有]
  • drag.minimumX : real [指定拖动的最小X坐标]
  • drag.maximumX : real[指定拖动的最大X坐标]
  • drag.minimumY : real [指定拖动的最小Y坐标]
  • drag.maximumY : real[指定拖动的最大Y坐标]

Rectangle {    id: container;    width: 200; height: 200;    color: "gray";    Rectangle {        id: rect;// anchors.left: parent.left // 若打开此句,则左边一直与父窗口左边垂直,无法横向拖动了        width: 50; height: 50;        color: "red";        opacity: (200.0 - rect.width - rect.x) / (200.0 - rect.width); // 拖动横轴影响透明度        MouseArea {            anchors.fill: parent;            drag.target: rect;            drag.axis: Drag.XAxis | Drag.YAxis;            drag.minimumX: 0;            drag.maximumX: container.width - rect.width;            drag.minimumY: 0;            drag.maximumY: container.height - rect.height;        }    }}

  • drag.filterChildren : bool [是否过滤掉子对象,过滤掉:鼠标点击先触发父对象后触发子对象]

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            onClicked: console.log("Clicked 11")            Rectangle {                color: "yellow"                x: 50; y : 50                width: 100; height: 100                MouseArea {                    anchors.fill: parent                    onClicked: console.log("Clicked")                }            }        }    }}

  • drag.threshold : real [以拖动操作开始时的像素值确定阈值。默认情况下,这将绑定到与平台相关的值。此属性添加在qtquick 2.2中]
  • enabled : bool [enabled属性来启用和禁用鼠标代理项目的处理。当禁用时,鼠标区域对鼠标事件透明]
  • hoverEnabled : bool [默认情况下,鼠标事件只在响应按钮事件或按下按钮时处理。即使没有按下鼠标按钮,悬停也能处理鼠标事件,主要影响onTntered和onExited事件,默认是false需按下触发,设置为true后,则鼠标进入区域就触发]
Rectangle{    color:"green"    width: 28    height: 28    MouseArea{        id:mouse;        anchors.fill:parent        hoverEnabled: true; // true-鼠标进入变色 false-鼠标进入后点击才变色,甚至焦点不在应用上        onEntered: {            parent.color="red";        }        onExited: {            parent.color="green";        }     }    Text {        text: "mouseX:" + mouse.mouseX + " mouseY:" + mouse.mouseY;    }}

  • mouseX : real [鼠标x坐标,相对于其父]
  • mouseY : real [鼠标y坐标,相对于其父]
  • pressed : bool [只读][鼠标按键是否被按住]
  • pressedButtons : MouseButtons [只读][按住的按钮]
  • preventStealing : bool [这个属性保存是否鼠标事件可以从MouseArea偷来的,默认是false,如果一个MouseArea放在一项过滤孩子鼠标事件,如flickable,鼠标事件可能被盗MouseArea如果手势是由父项的认可,例如滑动手势。如果preventstealing设置为true,没有项目会偷鼠标事件。注意设置preventstealing真正一旦项目开始盗窃事件将不会影响到下一个新闻事件。]
  • propagateComposedEvents : bool [这个属性保存是否由鼠标事件会自动传播到其他mouseareas重叠这MouseArea但低视觉堆叠顺序。默认情况下,此属性为false]

信号

  • onCanceled()

        当鼠标事件被取消时,该调用程序被调用,这是因为事件不被接受,或者是因为另一个项目窃取了鼠标事件处理。这个信号是用于高级用途:它是有用的当有多个MouseArea,处理输入,或出现在flickable个MouseArea。在后一种情况下,如果你执行一些逻辑上的压力信号并开始拖动,鼠标的flickable偷MouseArea处理。在这种情况下,复位逻辑当MouseArea失去了鼠标操作的flickable,onCanceled也要和onReleased一起处理。

  • onClicked(MouseEvent mouse)

        当单击时,调用这个处理程序。该动作定义为onRelease后触发,内部MouseArea(压、外移MouseArea,然后回到里面和释放也被认为是一个点击)。鼠标参数提供关于单击的信息,包括单击释放的x和y位置,以及单击是否被保留。(注:该鼠标事件参数中的accepted属性被忽略)。

  • onDoubleClicked(MouseEvent mouse)

        这个处理程序在双击时被调用(一个按下然后一个释放紧跟着一个按钮)。鼠标参数提供关于单击的信息,包括单击释放的x和y位置,以及单击是否被保留。如果鼠标参数接受属性设置为在处理虚假的onPressed / onReleased / onClicked句柄将被称为第二点击;否则被抑制。接受的属性默认为true。

  • onEntered()

        当鼠标进入鼠标区域时调用这个处理程序。默认情况下,onEntered处理器只叫当按钮被按下才触发。设置hoverEnabled为true时,只要进入鼠标区域就触发onEntered。

  • onExited()

        当鼠标退出鼠标区域时调用这个处理程序。默认情况下,onExited处理器只叫当按钮被按下。设置hoverEnabled为true时,没有按下鼠标按钮,离开区域会触发onExited。

  • onPositionChanged(MouseEvent mouse)

        鼠标位置改变时调用这个处理程序。鼠标参数提供有关鼠标的信息,包括x和y位置,以及当前按下的任意按钮。(注:该鼠标事件参数中的accepted属性被忽略)。

默认情况下,onpositionchanged处理器只叫当按钮被按下。设置hoverenabled真正使处理onpositionchanged时没有按下鼠标按钮。

  • onPressAndHold(MouseEvent mouse)

        长按压时,此处理程序(目前800ms)被调用。鼠标参数提供有关按压的信息,包括新闻的X和Y位置,以及按下哪个按钮。(注:该鼠标事件参数中的accepted属性被忽略)。

  • onPressed(MouseEvent mouse)

        这个处理程序被调用时,有一个按压。鼠标参数提供有关按压的信息,包括x和y位置以及按下哪个按钮。

        该事件的参数接受的属性决定这是否MouseArea将应对媒体和未来所有鼠标事件直到释放。默认是接受事件和不允许其他MouseArea在这一处理事件。如果被设置为false,没有进一步的事件将被发送到这个MouseArea直到按钮下压。

  • onReleased(MouseEvent mouse)

    当释放时调用这个处理程序。鼠标参数提供关于单击的信息,包括单击释放的x和y位置,以及单击是否被保留。(注:该鼠标事件参数中的accepted属性被忽略)。

  • onWheel(WheelEvent wheel)

该处理程序响应鼠标轮和触控板滚动手势。滚轮参数有关事件的信息提供,包括X和Y的位置,按下任何按钮目前,关于滚轮的运动,包括angleDelta pixelDelta

Keys

关于KeyEvent

         KeyEvent 代表一个按键事件,如果一个按键被处理, event.accepted 应该被设置为 true 以免它被继续传递;要是不设置它,那它可能会继续传递给其他的 item ,出现一些比较奇葩的现象。

描述

        所有可视的原始对象都支持按键处理,按键可以通过onPressed和onRelease信号处理。
keyEvent信号特性有一个参数,称为事件的事件细节,如果是一个关键的处理,event.accpepted应该设置为true,从而阻止其继续向其他层次传播。

属性

  • enabled : bool [设置项,默认为true,设置true的时候按键消息会被触发,否则不会被触发,可理解为按键使能]
  • forwardTo : list<Object> [此属性提供了将键输入键、键释放和键盘输入从输入方法转发到其他项的方法。当你想要一个Item来处理一些键(例如上下箭头键)和另一个处理其他键的项(例如左右箭头键)时,这一点很有用。一旦被转发的键接受事件,它就不再被转发到列表后面的项目]

Item {    ListView {        id: list1        // ...    }    ListView {        id: list2        // ...    }    Keys.forwardTo: [list1, list2]    focus: true}

  • priority enumeration[这个属性决定了在附加项的键处理之前或之后是否处理这些键。
             Keys.BeforeItem(默认)-在正常处理之前处理。如果事件被接受,它将不会被传递到该项。

             Keys.AfterItem-在正常处理之后处理。如果项接受键事件,则不会由键附加的属性处理程序处理。

信号

        按键有对应信号的则触发对应信号的press,如数字键对应onDeletePressed,如果先响应了onDeletePressed就不会再触发onPressed了,若没有响应onDeletePressed则可以触发onPressed,没有对应信号的就触发onPressed信号,松开始都会触发onRelease信号,有一些组合按键也会触发信号,如onBacktabPressed。总共有39个信号。

        长按键,除了几个控制按键(shift、ctrl、atl按下pressed状态可保持),其余的按键会在短暂停顿后变成连续按键(与以往的windows程序不同)。

下面测试按键消息程序(包含所有测试消息),直接赋值粘贴可运行测试

Rectangle {    width: 400;    height: 400;    color: "gray";    focus: true;    Keys.onAsteriskPressed:  console.log("onAsteriskPressed");    Keys.onBackPressed:      console.log("onBackPressed");    Keys.onBacktabPressed:   console.log("onBacktabPressed");    Keys.onCallPressed:      console.log("onCallPressed");    Keys.onCancelPressed:    console.log("onCancelPressed");    Keys.onContext1Pressed:  console.log("onContext1Pressed");    Keys.onContext2Pressed:  console.log("onContext2Pressed");    Keys.onContext3Pressed:  console.log("onContext3Pressed");    Keys.onContext4Pressed:  console.log("onContext4Pressed");    Keys.onDeletePressed:    console.log("onDeletePressed");    Keys.onDigit0Pressed:    console.log("onDigit0Pressed");    Keys.onDigit1Pressed:    console.log("onDigit1Pressed");    Keys.onDigit2Pressed:    console.log("onDigit2Pressed");    Keys.onDigit3Pressed:    console.log("onDigit3Pressed");    Keys.onDigit4Pressed:    console.log("onDigit4Pressed");    Keys.onDigit5Pressed:    console.log("onDigit5Pressed");    Keys.onDigit6Pressed:    console.log("onDigit6Pressed");    Keys.onDigit7Pressed:    console.log("onDigit7Pressed");    Keys.onDigit8Pressed:    console.log("onDigit8Pressed");    Keys.onDigit9Pressed:    console.log("onDigit9Pressed");    Keys.onDownPressed:    console.log("onDownPressed");    Keys.onEnterPressed:    console.log("onEnterPressed");    Keys.onEscapePressed:   console.log("onEscapePressed");    Keys.onFlipPressed:      console.log("onFlipPressed");    Keys.onHangupPressed:    console.log("onHangupPressed");    Keys.onLeftPressed:      console.log("onLeftPressed");    Keys.onMenuPressed:      console.log("onMenuPressed");    Keys.onNoPressed:        console.log("onNoPressed");    Keys.onPressed:          console.log("onPressed");    Keys.onReleased:         console.log("onReleased");    Keys.onReturnPressed:    console.log("onReturnPressed");    Keys.onRightPressed:     console.log("onRightPressed");    Keys.onSelectPressed:    console.log("onSelectPressed");    Keys.onSpacePressed:     console.log("onSpacePressed");    Keys.onTabPressed:       console.log("onTabPressed");    Keys.onUpPressed:        console.log("onUpPressed");    Keys.onVolumeDownPressed:console.log("onVolumeDownPressed");    Keys.onVolumeUpPressed:  console.log("onVolumeUpPressed");    Keys.onYesPressed:       console.log("onYesPressed");}

  • onAsteriskPressed(KeyEvent event) [对应按键“*”]
  • onBackPressed(KeyEvent event) [对应按键“*”]
  • onBacktabPressed(KeyEvent event) [对应按键“Shift+Tab”]
  • onCallPressed(KeyEvent event)
  • onCancelPressed(KeyEvent event)
  • onContext1Pressed(KeyEvent event)
  • onContext2Pressed(KeyEvent event)
  • onContext3Pressed(KeyEvent event)
  • onContext4Pressed(KeyEvent event)
  • onDeletePressed(KeyEvent event) [对应按键“del”]
  • onDigit0Pressed(KeyEvent event) [对应按键“0”]
  • onDigit1Pressed(KeyEvent event) [对应按键“1”]
  • onDigit2Pressed(KeyEvent event) [对应按键“2”]
  • onDigit3Pressed(KeyEvent event) [对应按键“3”]
  • onDigit4Pressed(KeyEvent event) [对应按键“4”]
  • onDigit5Pressed(KeyEvent event) [对应按键“5”]
  • onDigit6Pressed(KeyEvent event) [对应按键“6”]
  • onDigit7Pressed(KeyEvent event) [对应按键“7”]
  • onDigit8Pressed(KeyEvent event) [对应按键“8”]
  • onDigit9Pressed(KeyEvent event) [对应按键“9”]
  • onDownPressed(KeyEvent event) [对应按键“下”]
  • onEnterPressed(KeyEvent event)
  • onEscapePressed(KeyEvent event)
  • onFlipPressed(KeyEvent event)
  • onHangupPressed(KeyEvent event)
  • onLeftPressed(KeyEvent event)
  • onMenuPressed(KeyEvent event)
  • onNoPressed(KeyEvent event)
  • onPressed(KeyEvent event) [没有处理对应信号,则所有按键都会触发该信号,否则有预先定义信号并且处理了的,是无法再触发onPressed信号]
  • onReleased(KeyEvent event) [对应按键“”]
  • onReturnPressed(KeyEvent event)
  • onRightPressed(KeyEvent event)
  • onSelectPressed(KeyEvent event)
  • onSpacePressed(KeyEvent event)
  • onTabPressed(KeyEvent event) [对应按键“Tab”]
  • onUpPressed(KeyEvent event)
  • onVolumeDownPressed(KeyEvent event)
  • onVolumeUpPressed(KeyEvent event)
  • onYesPressed(KeyEvent event)



原博主博客地址:http://blog.csdn.net/qq21497936
本文章博客地址:http://blog.csdn.net/qq21497936/article/details/78552121

原创粉丝点击