QML的Key事件(Keys)详解

QML中的Keys元素提供了一些附加属性,之所以说是“附加属性”,是因为它与其它的QML元素用法不同。Keys是专门用来处理键盘事件KeyEvent的,它定义了许多针对特定按键的信号,例如digit0Pressed(KeyEvent
event)、spacePressed(KeyEvent
event)等,不过使用pressed(KeyEvent
event)和released(KeyEvent
event)这两个普通的信号就可以处理大部分按键事件了,信号的参数类型是KeyEvent,参数名是event,包含了按键的详细信息。

如果某个QML对象要响应按键事件,首先必须设置其focus属性为true,因为这个属性默认为false。一般情况下,我们处理了某个按键事件时,就会设置其event.accepted属性为true,这样做的目的是防止它的父对象稍后也处理同一个按键事件,即使父对象的focus没有设置为ture。

Keys有三个属性:enabled、forwardTo、prioriry。

enabled属性默认为true,为false时不能响应按键事件,影响的只是当前QML对象。Keys的enabled不同于Item的enabled,后者默认为true,为false时按键事件和鼠标事件都不能响应,影响的是当前对象及所有孩子对象,这一点在使用是需要特别注意。

forwardTo是个列表属性list<Object>,设置按键事件传递的顺序,某个QML对象在这个列表属性中时,即使没有设置focus为true也能响应按键事件,如果某个按键事件被列表属性中前面的Item处理了,后面的Item就不会再收到这个按键信号。

priority属性用来设置处理按键事件时的优先级,默认是Keys.BeforeItem,也就是说优先处理Keys附加属性的按键事件,然后才是Item本身的按键事件,但Keys已经处理过的按键事件就不会再传递到当前Item了,反之Keys.afterItem亦然。

下面是一个简单的例子,通过键盘上的方向键来运动黄色矩形:

import QtQuick 2.3

Rectangle {
    width: 800; height: 480
    color: "lightblue"

    focus: true;
    Keys.onEscapePressed: console.log("quit now?")
    Keys.forwardTo: moveRect

    Rectangle {
        id: moveRect
        width: 100; height: 100
        color: "yellow"

        Keys.onPressed: {
            switch(event.key) {
            case Qt.Key_Left:
                moveRect.x -= 10;
                break;
            case Qt.Key_Right:
                moveRect.x += 10;
                break;
            case Qt.Key_Up:
                moveRect.y -= 10;
                break;
            case Qt.Key_Down:
                moveRect.y += 10;
                break;
            default:
                return;
            }
            event.accepted = true
        }
    }
}

另外,我们还可以通过KeyNavigation来实现类似于上例的效果,这个是专门用来处理方向键和Tab键的,下面是一个响应Tab键的例子:

import QtQuick 2.3

Grid {
    width: 100; height: 100
    columns: 2

    Rectangle {
        id: one
        width: 50; height: 50
        color: focus ? "red" : "lightblue"
        focus: true
        KeyNavigation.tab: two
    }
    Rectangle {
        id: two
        width: 50; height: 50
        color: focus ? "red" : "lightblue"
        KeyNavigation.tab: four
    }
    Rectangle {
        id: three
        width: 50; height: 50
        color: focus ? "red" : "lightblue"
        KeyNavigation.tab: one
    }
    Rectangle {
        id: four
        width: 50; height: 50
        color: focus ? "red" : "lightblue"
        KeyNavigation.tab: three
    }
}

时间: 2024-10-06 15:06:50

QML的Key事件(Keys)详解的相关文章

QML的Mouse事件(MouseArea)详解

在UI应用程序中,我们常常要处理鼠标事件,一个MouseArea就可以搞定许多事情.MouseArea本身是不可见的,主要和一些可见的元素一起使用,先来看一下它有哪些属性: acceptedButtons:Qt::MouseButtons枚举类型,默认为Qt.leftButton,用来设置有效的鼠标按键,支持按位与"|"操作符,具体按键类型可参考-- http://doc.qt.io/qt-5/qt.html#MouseButton-enum pressed:bool类型,当accep

Android Touch事件分发详解

Android Touch事件分发详解 先说一些基本的知识,方便后面分析源码时能更好理解. - 所有Touch事件都被封装成MotionEvent对象,包括Touch的位置.历史记录.第几个手指等. 事件类型分为ACTION_DOWN,ACTION_UP,ACTION_MOVE,ACTION_POINTER_DOWN,ACTION_POINTER_UP,ACTION_CANCEL, 每个 一个完整的事件以ACTION_DOWN开始ACTION_UP结束,并且ACTION_CANCEL只能由代码引

jQuery 事件用法详解

jQuery 事件用法详解 目录 简介 实现原理 事件操作 绑定事件 解除事件 触发事件 事件委托 事件操作进阶 阻止默认事件 阻止事件传播 阻止事件向后执行 命名空间 自定义事件 事件队列 jquery中文文档 简介 jquery 之所以成为最受欢迎的前端库,很大一部分是得益于它的事件具有良好的语义,优秀的兼容性,并且便于管理和扩展. 在这里我会介绍 jquery 事件的一些比较基础的用法. 实现原理 jquery 事件脱胎于浏览器的 addEventListener (W3) 和 attac

cocos2dx+lua注册事件函数详解

coocs2dx 版本 3.1.1 registerScriptTouchHandler 注册触屏事件 registerScriptTapHandler 注册点击事件 registerScriptHandler 注册基本事件 包括 触屏 层的进入 退出 事件 registerScriptKeypadHandler 注册键盘事件 registerScriptAccelerateHandler 注册加速事件 registerScriptTouchHandler 详解(可以设置单点或多点) ? 1 2

Qt Quick 之 QML 与 C++ 混合编程详解

Qt Quick 技术的引入,使得你能够快速构建 UI ,具有动画.各种绚丽效果的 UI 都不在话下.但它不是万能的,也有很多局限性,原来 Qt 的一些技术,比如低阶的网络编程如 QTcpSocket ,多线程,又如 XML 文档处理类库 QXmlStreamReader / QXmlStreamWriter 等等,在 QML 中要么不可用,要么用起来不方便,所以呢,很多时候我们是会基于这样的原则来混合使用 QML 和 C++: QML 构建界面, C++ 实现非界面的业务逻辑和复杂运算. 请给

cocos2dx+lua注册事件函数详解 事件

coocs2dx 版本 3.1.1 registerScriptTouchHandler             注册触屏事件 registerScriptTapHandler                  注册点击事件 registerScriptHandler                         注册基本事件 包括 触屏 层的进入 退出 事件 registerScriptKeypadHandler           注册键盘事件 registerScriptAccelera

【学习笔记】HTML5视频的属性、方法、事件介绍 详解

规划了一下学习路线 HTML5 -> CSS3  -> JS ->综合 7.31日开始,做好笔记做好记录 认真学习. HTMLVideoElement和HTMLAudioElement 均继承自HTMLMediaElement)所以音频文件和视频文件大多数都是一样的,除了标签名称 <video> <audio> HTML视频 大多数视频是通过插件(比如 Flash)来显示的.然而,并非所有浏览器都拥有同样的插件. HTML5 规定了一种通过 video 元素来包含

(转载)【cocos2dx 3.x Lua] 注册事件函数详解

出处: http://www.2cto.com/kf/201409/338235.html coocs2dx 版本 3.1.1 registerScriptTouchHandler 注册触屏事件 registerScriptTapHandler 注册点击事件 registerScriptHandler 注册基本事件 包括 触屏 层的进入 退出 事件 registerScriptKeypadHandler 注册键盘事件 registerScriptAccelerateHandler 注册加速事件

高并发架构系列:Redis并发竞争key的解决方案详解

需求由来 1.Redis高并发的问题 Redis缓存的高性能有目共睹,应用的场景也是非常广泛,但是在高并发的场景下,也会出现问题:缓存击穿.缓存雪崩.缓存和数据一致性,以及今天要谈到的缓存并发竞争. 这里的并发指的是多个redis的client同时set key引起的并发问题. 2.出现并发设置Key的原因 Redis是一种单线程机制的nosql数据库,基于key-value,数据可持久化落盘.由于单线程所以Redis本身并没有锁的概念,多个客户端连接并不存在竞争关系,但是利用jedis等客户端