【QT开发笔记-基础篇】| 第四章 事件QEvent | 4.5 键盘事件

本文介绍了如何在Qt中处理QEvent::KeyPress和QEvent::KeyRelease事件,通过实例展示了如何监听键盘按键并控制标签控件的移动。通过重写keyPressEvent和keyReleaseEvent函数,以及利用Qt::Key枚举值,实现了基础按键操作和组合键的检测。

本章要实现的整体效果如下:

整体效果


QEvent::KeyPress

​ 键盘按下时,触发该事件,它对应的子类是 QKeyEvent

QEvent::KeyRelease

​ 键盘抬起时,触发该事件,它对应的子类是 QKeyEvent


本节通过两个案例来讲解这 2 个事件:

  • 键盘按下、释放事件的基本使用
  • 通过键盘的上下左右箭头,控制标签控件的上下

1. 键盘按下、释放事件的基本使用

只需重写 keyPressEvent()keyPressEvent() 两个函数即可

首先,在 key_widget.h 中添加两个函数的声明

class KeyWidget : public QWidget
{
protected:
    void keyPressEvent(QKeyEvent* event);
    void keyReleaseEvent(QKeyEvent* event);
};

然后,来到 key_widget.cpp 实现这 2 个函数:

void KeyWidget::keyPressEvent(QKeyEvent* event)
{
    // 普通键
    switch ( event->key() ) {
        case Qt::Key_Return:
            qDebug() << "Enter";
            break;
        case Qt::Key_Escape:
            qDebug() << "Esc";
            break;
        case Qt::Key_Control:
            qDebug() << "Ctrl";
            break;
        case Qt::Key_Shift:
            qDebug() << "Shift";
            break;
        case Qt::Key_Alt:
            qDebug() << "Alt";
            break;
        case Qt::Key_Up:
            qDebug() << "Up";
            break;
        case Qt::Key_Down:
            qDebug() << "Down";
            break;
        case Qt::Key_Left:
            qDebug() << "Left";
            break;
        case Qt::Key_Right:
            qDebug() << "Right";
            break;
        case Qt::Key_A:
            qDebug() << "A";
            break;
        case Qt::Key_B:
            qDebug() << "B";
            break;
        case Qt::Key_C:
            qDebug() << "C";
            break;
        case Qt::Key_D:
            qDebug() << "D";
            break;
        default:
            break;
    }

    // 两键组合
    //    qDebug() << event->modifiers(); // QFlags<Qt::KeyboardModifier>(ShiftModifier|ControlModifier)
    // event->modifiers(),用来判读是否按下 Ctrl/Shift/Alt 键
    if ( (event->modifiers() == Qt::ControlModifier) && (event->key() == Qt::Key_A) ) {
        qDebug() << "Ctrl + A";
    }

    if ( (event->modifiers() == Qt::ShiftModifier) && (event->key() == Qt::Key_C) ) {
        qDebug() << "Shift + B";
    }

    if ( (event->modifiers() == Qt::AltModifier) && (event->key() == Qt::Key_B) ) {
        qDebug() << "ALT + C";
    }

    // 三键组合Shift + Ctrl + D 的实现
    if ( (event->modifiers() == (Qt::ShiftModifier | Qt::ControlModifier)) && (event->key() == Qt::Key_D) ) {
        qDebug() << "CTRL + Shift + D";
    }
}

void KeyWidget::keyReleaseEvent(QKeyEvent* event)
{
    switch ( event->key() ) {
        case Qt::Key_Return:
            qDebug() << "keyReleaseEvent: Enter";
            break;
        case Qt::Key_Escape:
            qDebug() << "keyReleaseEvent: Esc";
            break;
        case Qt::Key_Up:
            qDebug() << "keyReleaseEvent: Up";
            break;
        case Qt::Key_Down:
            qDebug() << "keyReleaseEvent: Down";
            break;
        case Qt::Key_Left:
            qDebug() << "keyReleaseEvent: Left";
            break;
        case Qt::Key_Right:
            qDebug() << "keyReleaseEvent: Right";
            break;
        case Qt::Key_A:
            qDebug() << "keyReleaseEvent: A";
            break;
        case Qt::Key_B:
            qDebug() << "keyReleaseEvent: B";
            break;
        case Qt::Key_C:
            qDebug() << "keyReleaseEvent: C";
            break;
        case Qt::Key_D:
            qDebug() << "keyReleaseEvent: D";
            break;
        case Qt::Key_Control:
            qDebug() << "keyReleaseEvent: Ctrl";
            break;
        case Qt::Key_Shift:
            qDebug() << "keyReleaseEvent: Shift";
            break;
        case Qt::Key_Alt:
            qDebug() << "keyReleaseEvent: Alt";
            break;
    }
}

说明:

  • 每个按键对应一个枚举值,比如 Qt::Key_A 代表按键 AQt::Key_Control 代表 Crtl 键,等等
  • QKeyEvent 类的 key() 方法,可以获取当前按下的哪个按键
  • 判断 Ctrl/Shift/Alt 等控制按键,需要使用 QKeyEvent 类的 modifiers() 方法

最后,还需要在构造中添加如下语句:

KeyWidget::KeyWidget(QWidget* parent) : QWidget{parent}
{
    setFocusPolicy(Qt::StrongFocus);
}

此时,运行程序,可以看到打印如下:

运行效果


2. 键盘事件移动标签

接下来,实现一个小案例:通过上下左右按键,来移动标签的位置

(1)界面上添加标签

首先,在 key_widget.h 中添加成员变量:

#include <QLabel>

class KeyWidget : public QWidget
{
private:
    QLabel* lbl;
};

然后,在 key_widget.cpp 的构造中添加一个标签:

KeyWidget::KeyWidget(QWidget* parent) : QWidget{parent}
{
    setFocusPolicy(Qt::StrongFocus);

    // 添加一个 QLabel
    lbl = new QLabel(this);
    lbl->setText("");
    lbl->setFrameShape(QFrame::Box);
    lbl->setFixedSize(100, 100);
    lbl->setStyleSheet("background-color: red;");
}

此时,运行效果如下:

运行效果


(2)移动标签

只需修改上下左右按键的逻辑即可(当移动到尽头,则从另一端重新出现开始移动):

void KeyWidget::keyPressEvent(QKeyEvent* event)
{
    // 普通键
    switch ( event->key() ) {
        case Qt::Key_Up:
            qDebug() << "Up";
            lbl->move(lbl->x(), lbl->y() - 20);
            if ( lbl->y() + lbl->height() <= 0 ) {
                lbl->move(lbl->x(), this->height());
            }
            break;
        case Qt::Key_Down:
            qDebug() << "Down";
            lbl->move(lbl->x(), lbl->y() + 20);
            if ( lbl->y() >= this->height() ) {
                lbl->move(lbl->x(), 0);
            }
            break;
        case Qt::Key_Left:
            qDebug() << "Left";
            lbl->move(lbl->x() - 20, lbl->y());
            if ( lbl->x() + lbl->width() <= 0 ) {
                lbl->move(this->width(), lbl->y());
            }
            break;
        case Qt::Key_Right:
            qDebug() << "Right";
            lbl->move(lbl->x() + 20, lbl->y());
            if ( lbl->x() >= this->width() ) {
                lbl->move(0, lbl->y());
            }
            break;
    }
}

此时,按键盘上的上下左右箭头,效果如下:

运行效果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大轮明王讲QT

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值