键盘事件(KeyEvent)和焦点作用域(FocusScope)

 Qt Quick
时间:

当一个按键按下或者释放时,会产生一个键盘事件,并将其传递给具有焦点地Qt Quick项目(将一个项目地 focus属性设置位true,这个项目便会获得焦点).

1.按键处理概述
当用户按下或者释放一个按键,会按以下步骤进行处理:

* Qt获取键盘动作并产生一个键盘事件。
* 如果QQuickWindow是活动窗口,那么键盘事件会传递给它。
* 场景将键盘事件交付给具有活动焦点地项目。如果没有项目具有活动焦点,键盘事件会被忽略。
* 如果具有活动焦点的QQuickItem接受了该键盘事件,那么传播将停止。否则,该事件会传递到每一个项目的父项目,直到事件被接受或者到达根项目。
* 如果到达了跟项目,该键盘事件会被忽略而继续常规的Qt按键处理。

所有基于Item的可见项目都可以通过Keys附加属性来进行按键处理。Keys附加属性提供了基本的处理器,例如onPressed和onReleased,也提供了对特殊按键的处理器,例如onSpacePressed。

import QtQuick 2.0

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文本等主要属性。

  1. 导航键
    Qt Quick 还有一个KeyNavigation附加属性,可以用来实现使用方向键或者Tab键进行项目导航。它的属性有backtab(Shift + Tab),down,left,priority,right,tab和up等。
import QtQuick 2.2

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.left: topLeft
        KeyNavigation.down: bottomRight
    }
    Rectangle {
        id: bottomLeft
        width: 50; height: 50
        color: focus ? "red" : "lightgray"
        KeyNavigation.right: bottomRight
        KeyNavigation.up: topLeft
    }
    Rectangle {
        id: bottomRight
        width: 50; height: 50
        color: focus ? "red" : "lightgray"
        KeyNavigation.left: bottomLeft
        KeyNavigation.up: topRight
    }
}

左上角的项目因为将focus设置为了true,所以在初始化时它获得了焦点。

  1. 一个项目是否具有活动焦点,可以通过Item::activeFocus属性进行查询。
Text {
    text: activeFocus ? "focus!" : "no focus"
}
  1. 获取焦点和焦点作用域
    一个项目可以通过设置其focus属性为true来使其获得焦点。一般情况下,使用focus属性就足够了。
import QtQuick 2.2

Rectangle {
    color: "lightsteelblue"; width: 240; height: 25
    Text { id: myText }
    Item {
        id: keyHandler
        focus: true
        Keys.onPressed: {
            if(event.key == Qt.Key_A)
                myText.text = 'Key A was pressed'
            else if(event.key == Qt.Key_B)
                myText.text = 'Key B was pressed'
            else if(event.key == Qt.Key_C)
                myText.text = 'Key C was pressed'
        }
    }
}

当按下A,B,C键的时候就会更改文本内容。


0 评论