> 文章列表 > QML事件处理之键盘事件(KeyEvent)和焦点作用域(FocusScope)

QML事件处理之键盘事件(KeyEvent)和焦点作用域(FocusScope)

QML事件处理之键盘事件(KeyEvent)和焦点作用域(FocusScope)

事件

  • 1.按键处理概述
  • 2. 导航键

1.按键处理概述

当用户按下或者释放一个按键,会按以下步骤进行处理:
①Qt获取键盘动作并产生一个键盘事件。
②如果QQuickWindow是活动窗口,那么键盘事件会传递给它。
③场景将键盘事件交付给具有活动焦点的项目。如果没有项目具有活动焦点,键
盘事件会被忽略。
④如果具有活动焦点的QQuickltem接受了该键盘事件,那么传播将停止。否则,
该事件会传递到每一个项目的父项目,直到事件被接受或者到达根项目。
⑤如果到达了根项目,该键盘事件会被忽略而继续常规的Qt按键处理。
所有基于Item的可见项目都可以通过Keys附加属性来进行按键处理。Keys附
加属性提供了基本的处理器,例如onPressed和onReleased,也提供了对特殊按键的处
理器,例如onSpacePressed。

    Item {focus: trueKeys.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: 100columns: 2Rectangle {id: topLeftwidth: 50; height: 50color: focus ? " red" : "lightgray"focus: trueKeyNavigation.right: topRightKeyNavigation.down: bottomLeft}Rectangle {id: topRightwidth: 50; height: 50color: focus ? " red" : "lightgray"KeyNavigation.right: topLeftKeyNavigation.down: bottomRight}Rectangle {id: bottomLeftwidth: 50; height: 50color: focus ? " red" : "lightgray"KeyNavigation.right: topRightKeyNavigation.down: topLeft}Rectangle {id: bottomRightwidth: 50; height: 50color: focus ? " red" : "lightgray"KeyNavigation.right: bottomLeftKeyNavigation.down: topRight}}

左上角的项目因为将focus设置为了true,所以在初始化时它获得了焦点。当按下方向键,焦点会移动到相应的项目。KeyNavigation默认会在它绑定的项目之后获得键盘事件。如果该项目接收了这个键盘事件,那么KeyNavigation就不能再接收到该事件了。这个可以通过设置priority属性来进行更改。它有两个值:KeyNavigation.AfterItem(默认)、KeyNavigation.BeforeItem。当设置为第二个值时,KeyNavigation会在项目处理键盘事件之前处理该事件。不过,如果KeyNavigation处理了该
事件,这个事件就会被接收而不再传播到相应的项目了。如果要导航到的项目不可用或者不可见,那么会尝试跳过该项目并导航到下一个项目。也是说,允许在一个导航处理器中添加一个项目链,如果多个项目都不可用或者都不可见,它们同样会被跳过。