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

这篇具有很好参考价值的文章主要介绍了【QT开发笔记-基础篇】| 第四章 事件QEvent | 4.5 键盘事件。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

【QT开发笔记-基础篇】| 第四章 事件QEvent | 4.5 键盘事件,《QT开发笔记-基础篇》,qt,c++,事件,无边框窗口


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);
}

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

【QT开发笔记-基础篇】| 第四章 事件QEvent | 4.5 键盘事件,《QT开发笔记-基础篇》,qt,c++,事件,无边框窗口


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;");
}

此时,运行效果如下:

【QT开发笔记-基础篇】| 第四章 事件QEvent | 4.5 键盘事件,《QT开发笔记-基础篇》,qt,c++,事件,无边框窗口


(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;
    }
}

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

【QT开发笔记-基础篇】| 第四章 事件QEvent | 4.5 键盘事件,《QT开发笔记-基础篇》,qt,c++,事件,无边框窗口文章来源地址https://www.toymoban.com/news/detail-726423.html

到了这里,关于【QT开发笔记-基础篇】| 第四章 事件QEvent | 4.5 键盘事件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 王道计网 第四章笔记

    生活在网络层的“工人”是路由器,他负责各种异构网络的连接,但是因为他只生活在前三层所以从网络层之上的东西他不能管理,所以网路层之上的数据对于路由器来说必须是相同的、透明的。 常见的网络层协议有IP 和 ICMP TCP IP传输层协议 FTP应用层协议 一句话区分IP和M

    2024年02月14日
    浏览(45)
  • python笔记:第四章使用字典

    说白了就是键值对的映射关系 不会丢失数据本身关联的结构,但不关注数据的顺序 是一种可变类型 键的类型:字典的键可以是任何不可变的类型,如浮点数,字符串,元组 可以从其他映射或键值对创建字典 将字符串格式设置功能用于字典 使用format_map将两者结合起来 就地

    2024年02月13日
    浏览(63)
  • 西瓜书学习笔记---第四章 决策树

    目录 一、题目要求 二、数据集介绍  三、决策树模型 3.1 决策树模型介绍 3.2 决策树算法原理 3.2.1 决策树的建立 3.2.2 决策树的划分(1)—信息增益ID3 3.2.3 决策树的划分(2)—Gini指数CART 3.2.4 预剪枝pre-pruning 3.2.5 后剪枝post-pruning 3.3 决策树算法核心代码解释 四、运行结果

    2024年02月04日
    浏览(45)
  • 操作系统-笔记-第四章-文件管理

    一、第一章——操作系统的概念 二、第二章——【进程】 二、第二章——【线程】​编辑 二、第二章——【进程调度】 二、第二章——【进程同步与互斥】 二、第二章——【锁】 三、第三章——内存管理 四、第四章——文件管理 五、第五章——输入输出管理 🚀 学习心

    2024年02月11日
    浏览(68)
  • 计算机网络基础第四章

    主要任务是把 分组 从源端传到目的端,为分组交换网上的不同主机提供通信服务。网络层传输单位是 数据报 。 功能一:路由选择与分组转发( 最佳路径 ) 功能二:异构网络互联 功能三:拥塞控制(若所有结点都来不及接受分组,而要丢弃大量分组的话,网络就处于 拥塞

    2024年02月16日
    浏览(85)
  • 第四章:前端框架Vue基础入门

    本章学习目标: 了解Vue框架架构思想 掌握Vue核心指令 掌握计算属性与监视 掌握组件化开发模式 官方文档:https://cn.vuejs.org/guide/introduction.html. 文档可选择使用optionsAPI(选项式API)阅读,或者CompositionApi(组合式API)阅读。选项式API更适合平滑从vue2过渡,以下示例均以Compositi

    2024年02月12日
    浏览(43)
  • 计算机网络-笔记-第四章-网络层

    一、第一章——计算机网络概述 二、第二章——物理层 三、第三章——数据链路层 四、第四章——网络层 五、第五章——运输层 六、第六章——应用层 目录 ​​​​​​​ 四、第四章——网络层 1、网络层概述 (1)虚电路服务——面向连接 (2)虚电路服务——无连接

    2024年02月11日
    浏览(46)
  • JAVA学习笔记——第四章 运算符

    🔥 博客主页 : A_SHOWY 🎥 系列专栏 :力扣刷题总结录 数据结构  云计算  数字图像处理  力扣每日一题_ 运算符是一种特殊的符号,用于表示数据的运算、赋值和比较 取模 %的本质: a - (int)a / b * b//当a是小数时 自增 独立语句使用时,++i和i++没有区别的。但是如果作

    2024年01月20日
    浏览(59)
  • 第四章--Redis基础知识和面试题

    Redis 是一个基于内存的k-v结构数据库 基于内存存储,读写性能高 适合存储热点数据(热点商品, 资讯, 新闻) 企业应用广泛 Redis入门 简介: 应用场景 ⭐缓存 任务队列 消息队列 分布式锁 数据类型 常用命令 redis常用命令链接 redis.net.cn java中操作redis 介绍 :::info redis启动默认有16个

    2024年02月07日
    浏览(48)
  • 西瓜书读书笔记整理(五)—— 第四章 决策树

    4.1.1 什么是决策树算法 决策树算法 是一种通过构建 树形结构 进行分类和回归的机器学习算法。 决策树由结点 (node) 和有向边 (directed edge) 组成。结点有两种类型:内部结点 (internal node) 和叶结点 ( leaf node)。内部结点表示一个特征或属性,叶结点表示一个类。 4.1.2 决策树学习

    2024年02月13日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包