1.按键处理概述
当用户按下或者释放一个按键,会按以下步骤进行处理:
①Qt获取键盘动作并产生一个键盘事件。
②如果QQuickWindow是活动窗口,那么键盘事件会传递给它。
③场景将键盘事件交付给具有活动焦点的项目。如果没有项目具有活动焦点,键
盘事件会被忽略。
④如果具有活动焦点的QQuickltem接受了该键盘事件,那么传播将停止。否则,
该事件会传递到每一个项目的父项目,直到事件被接受或者到达根项目。
⑤如果到达了根项目,该键盘事件会被忽略而继续常规的Qt按键处理。
所有基于Item的可见项目都可以通过Keys附加属性来进行按键处理。Keys附
加属性提供了基本的处理器,例如onPressed和onReleased,也提供了对特殊按键的处
理器,例如onSpacePressed。
Item {
focus: true
Keys.onPressed: {
if(event.key === Qt.Key_Left)
console.log("move left");
event.accepted = true;
}
}
Keys.onReturnPressed: console.log("Pressed return");
这里的event.accepted设置为true,可以防止事件继续传播。大家可以参考Keys附加属性的帮助文档来查看其提供的所有处理器,在这些处理器中大多含有一个KeyEvent参数,它提供了关于该键盘事件的信息。例如这里的event.key获取了按下的按键,另外它还有accepted属性判断是否接收按键、isAutoRepeat属性判断是否是自动重复按键、modifiers修饰符和text按键生成的Unicode文本等主要属性。
2. 导航键
Qt Quick 还有一个KeyNavigation附加属性,可以用来实现使用方向键或者Tab键进行项目的导航。它的属性有backtab(Shift+Tab)、down、left、priority、right、tab
和up等。
Grid {
width: 100; height: 100
columns: 2
Rectangle {
id: topLeft
width: 50; height: 50
color: focus ? " red" : "lightgray"
focus: true
KeyNavigation.right: topRight
KeyNavigation.down: bottomLeft
}
Rectangle {
id: topRight
width: 50; height: 50
color: focus ? " red" : "lightgray"
KeyNavigation.right: topLeft
KeyNavigation.down: bottomRight
}
Rectangle {
id: bottomLeft
width: 50; height: 50
color: focus ? " red" : "lightgray"
KeyNavigation.right: topRight
KeyNavigation.down: topLeft
}
Rectangle {
id: bottomRight
width: 50; height: 50
color: focus ? " red" : "lightgray"
KeyNavigation.right: bottomLeft
KeyNavigation.down: topRight
}
}
左上角的项目因为将focus设置为了true,所以在初始化时它获得了焦点。当按下方向键,焦点会移动到相应的项目。KeyNavigation默认会在它绑定的项目之后获得键盘事件。如果该项目接收了这个键盘事件,那么KeyNavigation就不能再接收到该事件了。这个可以通过设置priority属性来进行更改。它有两个值:KeyNavigation.AfterItem(默认)、KeyNavigation.BeforeItem。当设置为第二个值时,KeyNavigation会在项目处理键盘事件之前处理该事件。不过,如果KeyNavigation处理了该
事件,这个事件就会被接收而不再传播到相应的项目了。如果要导航到的项目不可用或者不可见,那么会尝试跳过该项目并导航到下一个项目。也是说,允许在一个导航处理器中添加一个项目链,如果多个项目都不可用或者都不可见,它们同样会被跳过。