前言这一节我们还是继续讲一下QML中的事件处理之键盘事件,鼠标键盘作为树莓派常用的外接设备,在QML开发中占据了十分重要的地位。这一节内容比较简单,建议大家和上一节一起学习。键盘事件的定义Keys对象是Qt Quick提供专门为Item处理按键事件的对象。它定义了很多信号。我们最常用的信号就是onPressed和onReleased信号。这两个信号是针对大部分的按键的。需要注意的是如果有预先定义信号并且处理了的,是无法再触发onPressed信号。比如说数字按键1,如果先响应onDigit1Pressed了,就不会再去触发onPressed信号。其他的特定按键的信号:
键盘事件的属性Keys有三个属性:
Qt Qucik提供的一些空间本身就会处理按键,比如checkbox,它可以通过响应空格键来选中或取消选中,不需要为其附加Keys对象来再次处理按键事件。如果我们想要某个元素处理按键,就需要把焦点给它,通过Item的focus属性来控制。 例程解析新建工程,我们先看一个特定按键,输入代码Rectangle { anchors.fill: parent color: "gray"; focus: true Keys.enabled: true Keys.onEscapePressed: { Qt.quit() } } 我们将焦点给矩形,设置可以处理按键,然后调用onEscapePressed信号,当按下Esc键时,程序退出。然后测试一下forward属性,在Rectangle对象中添加Text和Checkbox控件,分别设置它们的id为text和checkbox。设置forward属性。 Keys.forwardTo: [text, checkbox] 转发按键给Text和Checkbox控件,因为Text在前面,所以如果它响应了某个按键的话,Checkbox就收不到了。 Text { id: text x: 20 y: 20 width: 200 height: 30 text: "Move me !" color: "blue" font { bold: true pixelSize: 24 } Keys.onPressed: { switch(event.key){ case Qt.Key_Left: x -= 10 break case Qt.Key_Right: x += 10 break case Qt.Key_Down: y += 10 break case Qt.Key_Up: y -= 10 break default: return } event.accepted = true } } CheckBox { id: checkbox text: "Select me!" anchors.left: parent.left anchors.leftMargin: 10 anchors.bottom: parent.bottom anchors.bottomMargin: 10 } 在Text对象中,调用onPressed信号,则所有的按键都会触发该信号,所以用switch语句来选择我们需要的按键。这里主要是一个方向移动的演示,所以选择上下左右四个按键。每次按键时,相应的x、y坐标都会变化。 后面的Checkbox对象,虽然感觉没有触发按键,但是之前我们也说过,这类控件,不需要为其附加Keys对象也能处理按键事件。所以当你按下空格键时,Checkbox会自动选中或取消选中。 看一下效果: 因为空格键并未在Text对象中设置,所以Checkbox还可以接收此信号,如果在switch中加入Key_Space按键的处理,则Checkbox控件就无法实现空格键选中的效果了。大家可以自己试一下。 总结源码:Key.zip |