qt qml 类型之Keys
Keys 类是 Qt Quick 提供的,专门供 Item 处理按键事件的类。它定义了很多针对特定按键的信号,比如 onReturnPressed / onEscapePressed / onDownPressed / onDigit0Pressed / onBackPressed 等等;它还定义了更为普通的 onPressed 和 onReleased 信号,一般地,你可以使用这两个信号来处理大部分按键,它们有一个名字是 event 的 KeyEvent 参数,包含了按键的详细信息。
KeyEvent 代表一个按键事件,如果一个按键被处理, event.accepted 应该被设置为 true 以免它被继续传递;要是你不设置它,那它可能会继续传递给其他的 item ,出现一些奇奇怪怪的问题。
例子:
Item {
anchors.fill: parent
focus: true
Keys.onPressed: {//其实,Keys是作为的附加属性,利用附加属性来处理按键信息。我理解为Keys是Item的一个成员!
if (event.key == Qt.Key_Left) {
console.log("move left");
event.accepted = true;
}
}
}
focus: true
Keys.onPressed: {//其实,Keys是作为的附加属性,利用附加属性来处理按键信息。我理解为Keys是Item的一个成员!
if (event.key == Qt.Key_Left) {
console.log("move left");
event.accepted = true;
}
}
}
我尝试过Keys.onPressed 和Keys.onReleased通过使用,例如用来检测键盘的空格按键,一个问题:快速地按一下空格键,会先自动调用onPressed,然后马上自动调用onReleased,蛋疼!而且,如果你按住空格键不松开的话,按常理这时应该只是发出了pressed信号吧,但是,一直会循环往复地自动执行这两个槽函数,直至天荒地老!难道,设计Keys类的QT公司的人就是这样写的,还没看源码。 尝试过,通过调用write()函数,向键盘对用的文件设备仅仅写一个空格键被按下的事件,这时,这两个槽函数都会被执行! 尝试过,通过调用write()函数,向键盘对用的文件设备仅仅写一个空格键被松开的事件,这时,这两个槽函数都不会被执行! 尝试了使用Keys.onSpacePressed,同样的现象!
QT文档中,在将Keys类时,有一段介绍Key Handling Priorities的话:
The Keys attached property can be configured to handle key events before or after the item it is attached to. This makes it possible to intercept events in order to override an item's default behavior, or act as a fallback for keys not handled by the item.
If priority is Keys.BeforeItem (default) the order of key event processing is:
1)Items specified in forwardTo
2)specific key handlers, e.g. onReturnPressed
3)onPressed, onReleased handlers //看起来像是onReleased()总是会自动执行!
4)Item specific key handling, e.g. TextInput key handling
5)parent item
2)specific key handlers, e.g. onReturnPressed
3)onPressed, onReleased handlers //看起来像是onReleased()总是会自动执行!
4)Item specific key handling, e.g. TextInput key handling
5)parent item