【QT开发笔记-基础篇】| 第四章 事件QEvent | 4.5 键盘事件
本章要实现的整体效果如下:

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代表按键A,Qt::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);// 添加一个 QLabellbl = 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;}
}
此时,按键盘上的上下左右箭头,效果如下:

相关文章:
【QT开发笔记-基础篇】| 第四章 事件QEvent | 4.5 键盘事件
本章要实现的整体效果如下: QEvent::KeyPress 键盘按下时,触发该事件,它对应的子类是 QKeyEvent QEvent::KeyRelease 键盘抬起时,触发该事件,它对应的子类是 QKeyEvent 本节通过两个案例来讲解这 2 个事件&…...
爬取微博热榜并将其存储为csv文件
🙌秋名山码民的主页 😂oi退役选手,Java、大数据、单片机、IoT均有所涉猎,热爱技术,技术无罪 🎉欢迎关注🔎点赞👍收藏⭐️留言📝 获取源码,添加WX 目录 前言1.…...
国庆中秋特辑(八)Spring Boot项目如何使用JPA
国庆中秋特辑系列文章: 国庆中秋特辑(八)Spring Boot项目如何使用JPA 国庆中秋特辑(七)Java软件工程师常见20道编程面试题 国庆中秋特辑(六)大学生常见30道宝藏编程面试题 国庆中秋特辑&…...
用jad反编译工具查看java接口相关的默认修饰符
接口抽象类复习 -> 默认修饰符是啥 -> jad反编译证明 https://www.cnblogs.com/changrunwei/p/6618117.html 文章目录 背景操作过程反编译前后对比操作截图结论 背景 今天刷到这篇文章,想起之前笔试题总是记不清,所以想证明下。 之前一直不清楚要…...
axios的get请求时数组参数没有下标
开发新项目过程中 发现get请求时 数组参数没有下标 这样肯定是不行的 后端接口需要数组[0]: 7 数组[1]:4这样的数据 原因是因为在请求拦截器没有处理需要的参数 解决方法 在请求拦截器 处理一下参数 import axios, { AxiosError, AxiosInstance, AxiosRequestHeaders } fro…...
bochs 对 Linux0.11 进行调试 (TODO: 后面可以考虑集成 vscode+gdb+qemu)
我在阅读 Linux0.11 源码时,对一个指令 LDS 感到困惑。 看了下 intel 指令集手册,能猜到 LDS 的功能,但不确定。 于是决定搭建调试环境,看看 LDS 的功能是否真如自己猜测。 首先 make debug 运行 qemu-Linux0.11,命…...
一文告知HTTP GET是否可以有请求体
HTTP GET是否可以有请求体 先说结论: HTTP协议没有规定GET请求不能携带请求体,但是部分浏览器会不支持,因此不建议GET请求携带请求体。 HTTP 协议没有为 GET 请求的 body 赋予语义,也就是即不要求也不禁止 GET 请求带 body。大多数…...
防止SQL注入攻击的综合解决方案
文章目录 摘要背景和危害性防御措施示例代码(Java)示例代码(PHP)示例MySQL命令示例代码(Python)示例代码(C#,使用Entity Framework) 进一步防御SQL注入攻击的措施使用ORM…...
MapReduce(林子雨慕课课程)
文章目录 7. MapReduce7.1 MapReduce简介7.1.1 分布式并行编程7.1.2 MapReduce模型简介 7.2 MapReduce体系结构7.3 MapReduce工作流程概述7.4 Shuffle过程原理7.5 MapReduce应用程序的执行过程7.6 WordCount实例分析7.7 MapReduce的具体应用7.8 MaReduce编程实践 7. MapReduce …...
PHP聊天系统源码 在线聊天系统网站源码 后台自适应PC与移动端
程序前台与后台自适应PC与移动端,支持一对多交流,可以自由创建新的房间与解散创建的房间,集成签到功能,等级功能,房间创建者可以对用户进行禁言、拉黑处理,房间可以由房间创建者自由设置进入密码࿰…...
算法题:买卖股票的最佳时机 II (贪心算法解决股票问题)
这道题是贪心算法的中级难度练习题,由于题目设定,整个价格都是透明的,这里并不涉及需要预测股票涨势的问题。解决思路不难,就是一旦股票价格开始下降了就买入,一旦上升了,就赶紧卖出。(完整题目…...
Redis-持久化机制
持久化机制介绍 RDBAOFRDB和AOF对比 RDB rdb的话是利用了写时复制技术,他是看时间间隔内key值的变化量,就比如20秒内如果有5个key改变过的话他就会创建一个fork子进程(bgsave),通过这个子进程,将数据快照进…...
【LeetCode热题100】--155.最小栈
155.最小栈 设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。 实现 MinStack 类: MinStack() 初始化堆栈对象。void push(int val) 将元素val推入堆栈。void pop() 删除堆栈顶部的元素。int top() 获取堆栈顶部的元…...
Allegro 17.2如何直接更新元件封装?
想必很多从事电子设计的小伙伴,都有这样的经历:有些时候原理图和PCB设计是由不同的工程师负责,然后偶尔需要在没有原理图的情况下直接对PCB作品进行操作,如更新元件封装等操作,这种环节不仅费时费力,效率贼…...
高效数据管理:Java助力实现Excel数据验证
摘要:本文由葡萄城技术团队原创并首发。转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 前言 在Java中,开发者可以使用一些开源的库(如Apache POI)…...
Easysearch Chart 0.2.0都有哪些变化
Easysearch Chart 包更新了,让我们来看看都有哪些变化: Docker 镜像升级 Service 名称调整,支持 NodePort 模式部署 现在让我们用 NodePort 模式部署一下: # helm search repo infinilabs NAME CHART VERSION …...
RV1126-RV1109-进入uboot的按键和名字显示-HOSTNAME
今天添加一个小功能,就是uboot是按CTRLC进入的 今日我做了一个定制,让按L或者l让也进入uboot指令模式,并且修改主板名字显示 默认是CTRLC:键码值是0x03(ASCII对照表) 于是代码中跟踪: //rv1126_rv1109/u-boot/common/console.c int ctrlc(void) { #ifndef CONFIG_SANDBOXif (…...
学习vue-router
可参见: vue-router 详解_vue router_七月J的博客-CSDN博客 https://www.cnblogs.com/chen-ao666/p/17144552.html vue-router的使用 使用vue-router的步骤: 创建路由组件 配置路由映射: 组件和路径映射关系 使用路由: 通过和 <router-link>: 该标签是一个vue-router中…...
Python爬虫提高排名
在如今竞争激烈的互联网时代,网站的SEO优化变得尤为重要。而Python爬虫作为一种强大的工具,可以帮助网站主们提升搜索排名,吸引更多的流量和用户。本文将为您揭秘如何利用Python爬虫来改善您的SEO优化,并帮助您提升搜索排名。无论…...
SQL获取正数第N个或倒数第N个数据
这里我们使用Order By与Limit的组合: Order By:可以将某个序列值按照从大到小或从小到大排序Limit:如果类似Limit 5表示前5个,Limit 3,5表示从第4个位置(以0为开始)开始往后取5个 通过这样的组合就可以实…...
避坑指南:在Windows 11上用Docker Compose一键部署Casdoor(含MySQL和持久化配置)
Windows 11容器化部署Casdoor全攻略:告别环境配置噩梦 "明明按照文档一步步操作,为什么我的Casdoor就是跑不起来?"这可能是许多Windows开发者初次接触开源身份认证系统时的共同困惑。传统部署方式需要手动配置Go、Node.js、Yarn、…...
GuwenBERT:让AI读懂千年古文,开启古籍智能处理新时代
GuwenBERT:让AI读懂千年古文,开启古籍智能处理新时代 【免费下载链接】guwenbert GuwenBERT: 古文预训练语言模型(古文BERT) A Pre-trained Language Model for Classical Chinese (Literary Chinese) 项目地址: https://gitcod…...
Python实战:用WordCloud打造个性化圆形词云图
1. 为什么你需要圆形词云图? 词云图是数据可视化中最直观的展现形式之一。相比传统的柱状图、折线图,词云能更生动地呈现文本数据的核心信息。而圆形词云图在视觉上更加聚焦,特别适合用于社交媒体分析、用户画像展示等场景。比如你要分析微博…...
告别鼠标拖拽:用Mermaid重新定义技术图表创作流程
告别鼠标拖拽:用Mermaid重新定义技术图表创作流程 【免费下载链接】mermaid mermaid-js/mermaid: 是一个用于生成图表和流程图的 Markdown 渲染器,支持多种图表类型和丰富的样式。适合对 Markdown、图表和流程图以及想要使用 Markdown 绘制图表和流程图的…...
如何快速优化Windows掌机:终极体感控制完整指南
如何快速优化Windows掌机:终极体感控制完整指南 【免费下载链接】HandheldCompanion ControllerService 项目地址: https://gitcode.com/gh_mirrors/ha/HandheldCompanion 还在为Windows掌机操作不够精准、游戏兼容性差、配置切换麻烦而烦恼吗?Ha…...
零基础玩转TensorFlow-v2.15:Jupyter与SSH两种方式快速上手
零基础玩转TensorFlow-v2.15:Jupyter与SSH两种方式快速上手 深度学习正在改变我们解决问题的方式,而TensorFlow作为最受欢迎的深度学习框架之一,让开发者能够轻松构建和训练复杂的机器学习模型。但对于初学者来说,环境配置往往成…...
大数据领域规范性分析:助力企业决策优化
大数据领域规范性分析:助力企业决策优化 关键词:规范性分析、大数据决策、描述性分析、预测性分析、优化算法、企业决策、数据驱动 摘要:在数据爆炸的时代,企业不再满足于“数据记录”或“未来预测”,而是渴望知道“如何行动才能最优”。本文将从大数据分析的三大支柱(描…...
AI Agent交互设计避坑指南:从Manus到Cursor的7个实战技巧
AI Agent交互设计避坑指南:从Manus到Cursor的7个实战技巧 当AI Agent从简单的指令执行者进化为能自主规划、调用工具并修正错误的"数字伙伴"时,交互设计的复杂度呈指数级增长。去年某知名设计团队调研显示,78%的AI产品失败案例源于…...
OpenClaw剪藏工具:Qwen3-VL:30B分类保存网页内容到Flomo
OpenClaw剪藏工具:Qwen3-VL:30B分类保存网页内容到Flomo 1. 为什么需要智能剪藏工具 作为一个每天要处理大量信息的开发者,我长期被碎片化知识管理问题困扰。浏览器收藏夹里堆积着上千个未分类的网页,微信收藏夹里塞满来不及整理的截图&…...
从L298到自举H桥:深入聊聊直流电机驱动方案的演进与选型心得
从L298到自举H桥:直流电机驱动方案的技术演进与工程实践 在机器人底盘、自动化产线和智能硬件开发中,直流电机驱动电路的设计往往决定着整个系统的性能天花板。十年前我们可能还在用L298这类经典驱动芯片,如今工程师们的工具箱里已经出现了IR…...
