前言这一节我们还是继续讲一下QML中的事件处理之键盘事件,鼠标键盘作为树莓派常用的外接设备,在QML开发中占据了十分重要的地位。这一节内容比较简单,建议大家和上一节一起学习。键盘事件的定义Keys对象是Qt Quick提供专门为Item处理按键事件的对象。它定义了很多信号。我们最常用的信号就是onPressed和onReleased信号。这两个信号是针对大部分的按键的。需要注意的是如果有预先定义信号并且处理了的,是无法再触发onPressed信号。比如说数字按键1,如果先响应onDigit1Pressed了,就不会再去触发onPressed信号。其他的特定按键的信号:- 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”]
- onDigit0~9Pressed(KeyEvent event) [对应按键“0~9”]
- onDownPressed(KeyEvent event) [对应按键“下”]
- onEnterPressed(KeyEvent event) [对应按键“Enter”]
- onEscapePressed(KeyEvent event) [对应按键“Esc”]
- onFlipPressed(KeyEvent event)
- onHangupPressed(KeyEvent event)
- onLeftPressed(KeyEvent event) [对应按键“左”]
- onMenuPressed(KeyEvent event) [对应按键“菜单”]
- onNoPressed(KeyEvent event)
- onReturnPressed(KeyEvent event) [对应按键“Enter”]
- 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)
键盘事件的属性Keys有三个属性:- enabled:控制是否处理按键
- forward:列表属性,它表示传递按键事件给列表内的对象,如果某个对象accept了某个按键,那位列其后的对象就不会收到该按键事件。
- priority:设置Keys附件属性的优先级。在Item之前或是之后或者之后处理按键
Qt Qucik提供的一些空间本身就会处理按键,比如checkbox,它可以通过响应空格键来选中或取消选中,不需要为其附加Keys对象来再次处理按键事件。如果我们想要某个元素处理按键,就需要把焦点给它,通过Item的focus属性来控制。 例程解析新建工程,我们先看一个特定按键,输入代码07 | Keys.onEscapePressed: { |
我们将焦点给矩形,设置可以处理按键,然后调用onEscapePressed信号,当按下Esc键时,程序退出。然后测试一下forward属性,在Rectangle对象中添加Text和Checkbox控件,分别设置它们的id为text和checkbox。设置forward属性。 1 | Keys.forwardTo: [text, checkbox] |
转发按键给Text和Checkbox控件,因为Text在前面,所以如果它响应了某个按键的话,Checkbox就收不到了。
4 | anchors.left: parent.left |
6 | anchors.bottom: parent.bottom |
7 | anchors.bottomMargin: 10 |
在Text对象中,调用onPressed信号,则所有的按键都会触发该信号,所以用switch语句来选择我们需要的按键。这里主要是一个方向移动的演示,所以选择上下左右四个按键。每次按键时,相应的x、y坐标都会变化。 后面的Checkbox对象,虽然感觉没有触发按键,但是之前我们也说过,这类控件,不需要为其附加Keys对象也能处理按键事件。所以当你按下空格键时,Checkbox会自动选中或取消选中。 看一下效果: 
因为空格键并未在Text对象中设置,所以Checkbox还可以接收此信号,如果在switch中加入Key_Space按键的处理,则Checkbox控件就无法实现空格键选中的效果了。大家可以自己试一下。 总结
其实,鼠标键盘事件的使用都是很杂很乱的的,因为其往往是伴随着某个或者某几个控件的使用,所以这两节就需要小伙伴自己多理解和练习了,不要盲目的只敲代码,更需要理解其如何使用。 |