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

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处理了该
事件,这个事件就会被接收而不再传播到相应的项目了。如果要导航到的项目不可用或者不可见,那么会尝试跳过该项目并导航到下一个项目。也是说,允许在一个导航处理器中添加一个项目链,如果多个项目都不可用或者都不可见,它们同样会被跳过。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值