立即注册 找回密码

微雪课堂

搜索
微雪课堂 树莓派 树莓派QT教程 查看内容

树莓派Qt系列教程10:键盘事件

2020-7-22 13:07| 发布者: dasi| 查看: 7503| 评论: 0|原作者: dasi

摘要: 这一节讲一下QML中的事件处理之键盘事件

前言

这一节我们还是继续讲一下QML中的事件处理之键盘事件,鼠标键盘作为树莓派常用的外接设备,在QML开发中占据了十分重要的地位。这一节内容比较简单,建议大家和上一节一起学习。

键盘事件的定义

Keys对象是Qt Quick提供专门为Item处理按键事件的对象。它定义了很多信号。我们最常用的信号就是onPressed和onReleased信号。这两个信号是针对大部分的按键的。需要注意的是如果有预先定义信号并且处理了的,是无法再触发onPressed信号。比如说数字按键1,如果先响应onDigit1Pressed了,就不会再去触发onPressed信号。其他的特定按键的信号:

  • onAsteriskPressed(KeyEvent event) [对应按键“*”]
  • onBackPressed(KeyEvent event) [对应按键“*”]
  • onBacktabPressed(KeyEvent event) [对应按键“Shift+Tab”]
  • onCallPressed(KeyEvent event)
  • onCancelPressed(KeyEvent event)
  • onContext1Pressed(KeyEvent event)
  • onContext2Pressed(KeyEvent event)
  • onContext3Pressed(KeyEvent event)
  • onContext4Pressed(KeyEvent event)
  • onDeletePressed(KeyEvent event) [对应按键“del”]
  • onDigit0~9Pressed(KeyEvent event) [对应按键“0~9”]
  • onDownPressed(KeyEvent event) [对应按键“下”]
  • onEnterPressed(KeyEvent event) [对应按键“Enter”]
  • onEscapePressed(KeyEvent event) [对应按键“Esc”]
  • onFlipPressed(KeyEvent event)
  • onHangupPressed(KeyEvent event)
  • onLeftPressed(KeyEvent event) [对应按键“左”]
  • onMenuPressed(KeyEvent event) [对应按键“菜单”]
  • onNoPressed(KeyEvent event)
  • onReturnPressed(KeyEvent event) [对应按键“Enter”]
  • onRightPressed(KeyEvent event) [对应按键“右”]
  • onSelectPressed(KeyEvent event)
  • onSpacePressed(KeyEvent event) [对应按键“空格”]
  • onTabPressed(KeyEvent event) [对应按键“Tab”]
  • onUpPressed(KeyEvent event) [对应按键“上”]
  • onVolumeDownPressed(KeyEvent event)
  • onVolumeUpPressed(KeyEvent event)
  • onYesPressed(KeyEvent event)

键盘事件的属性

Keys有三个属性:

  1. enabled:控制是否处理按键
  2. forward:列表属性,它表示传递按键事件给列表内的对象,如果某个对象accept了某个按键,那位列其后的对象就不会收到该按键事件。
  3. priority:设置Keys附件属性的优先级。在Item之前或是之后或者之后处理按键

Qt Qucik提供的一些空间本身就会处理按键,比如checkbox,它可以通过响应空格键来选中或取消选中,不需要为其附加Keys对象来再次处理按键事件。如果我们想要某个元素处理按键,就需要把焦点给它,通过Item的focus属性来控制。

例程解析

新建工程,我们先看一个特定按键,输入代码
Rectangle {
        anchors.fill: parent
        color: "gray";

        focus: true
        Keys.enabled: true
        Keys.onEscapePressed: {
            Qt.quit()
        }
    }

我们将焦点给矩形,设置可以处理按键,然后调用onEscapePressed信号,当按下Esc键时,程序退出。然后测试一下forward属性,在Rectangle对象中添加Text和Checkbox控件,分别设置它们的id为text和checkbox。设置forward属性。

Keys.forwardTo: [text, checkbox]

转发按键给Text和Checkbox控件,因为Text在前面,所以如果它响应了某个按键的话,Checkbox就收不到了。

Text {
        id: text
        x: 20
        y: 20
        width: 200
        height: 30
        text: "Move me !"
        color: "blue"
        font {
            bold: true
            pixelSize: 24
        }
        Keys.onPressed: {
            switch(event.key){
            case Qt.Key_Left:
                x -= 10
                break
            case Qt.Key_Right:
                x += 10
                break
            case Qt.Key_Down:
                y += 10
                break
            case Qt.Key_Up:
                y -= 10
                break
            default:
                return
            }
            event.accepted = true
        }
    }


CheckBox {
            id: checkbox
            text: "Select me!"
            anchors.left: parent.left
            anchors.leftMargin: 10
            anchors.bottom: parent.bottom
            anchors.bottomMargin: 10
        }

在Text对象中,调用onPressed信号,则所有的按键都会触发该信号,所以用switch语句来选择我们需要的按键。这里主要是一个方向移动的演示,所以选择上下左右四个按键。每次按键时,相应的x、y坐标都会变化。

后面的Checkbox对象,虽然感觉没有触发按键,但是之前我们也说过,这类控件,不需要为其附加Keys对象也能处理按键事件。所以当你按下空格键时,Checkbox会自动选中或取消选中。

看一下效果:

因为空格键并未在Text对象中设置,所以Checkbox还可以接收此信号,如果在switch中加入Key_Space按键的处理,则Checkbox控件就无法实现空格键选中的效果了。大家可以自己试一下。

总结

源码:Key.zip

其实,鼠标键盘事件的使用都是很杂很乱的的,因为其往往是伴随着某个或者某几个控件的使用,所以这两节就需要小伙伴自己多理解和练习了,不要盲目的只敲代码,更需要理解其如何使用。

216

顶一下

刚表态过的朋友 (216 人)

相关阅读

微雪官网|产品资料|手机版|小黑屋|微雪课堂. ( 粤ICP备05067009号 )

GMT+8, 2024-11-22 13:27 , Processed in 0.012196 second(s), 13 queries .

返回顶部