QT系列教程(14) QT 按键事件

devtools/2025/3/13 20:09:59/

按键事件

按键事件是Qt提供的特有的事件体系,其头文件为QKeyEvent,这一篇我们通过一个demo演示按键事件,首先我们创建一个QApplication项目,创建类名为Widget,继承自QWidget,然后在ui里添加一个button。重写Widget的keyPressEvent函数

void Widget::keyPressEvent(QKeyEvent *event){//判断是ctrl+Mif(event->modifiers() == Qt::ControlModifier){if(event->key() == Qt::Key_M  && windowState() != Qt::WindowFullScreen){setWindowState(Qt::WindowFullScreen);return;}return;}//如果按下的是ESCif(event->key() == Qt::Key_Escape && windowState() == Qt::WindowFullScreen){setWindowState(Qt::WindowNoState);return;}
}

在这个按键事件里,我们判断了是否按下控制键Ctrl,如果按下了控制键Ctrl并且按下M键,则进行之后的判断逻辑。
如果此时窗口并不是全屏,那么就将窗口设置为全屏,否则什么都不做。
如果按下的是ESC键,且此时窗口全屏,则将窗口设置为正常状态,非全屏。

控制按钮移动

我们可以通过上下左右键控制按钮移动,需求如下
1 当我们按住一个方向键时控制按钮朝一个方向移动
2 当我们同时按住两个方向键则让其朝着两个方向的中间移动

void Widget::keyPressEvent(QKeyEvent *event){bool b_upflag= false;bool b_downflag = false;bool b_leftflag = false;bool b_rightflag = false;if(event->key() == Qt::Key_Up){if(event->isAutoRepeat()){auto curpos = ui->pushButton->pos();curpos.setY(curpos.y()-5);ui->pushButton->move(curpos);return;}else{b_upflag = true;}}if(event->key() == Qt::Key_Left){if(event->isAutoRepeat()){auto curpos = ui->pushButton->pos();curpos.setX(curpos.x()-5);ui->pushButton->move(curpos);return;}else{b_leftflag = true;}}if(event->key() == Qt::Key_Down){if(event->isAutoRepeat()){auto curpos = ui->pushButton->pos();curpos.setY(curpos.y()+5);ui->pushButton->move(curpos);return;}else{b_downflag = true;}}if(event->key() == Qt::Key_Right){if(event->isAutoRepeat()){auto curpos = ui->pushButton->pos();curpos.setX(curpos.x()+5);ui->pushButton->move(curpos);return;}else{b_rightflag = true;}}auto curpos = ui->pushButton->pos();if(b_upflag){curpos.setY(curpos.y()-5);}if(b_downflag){curpos.setY(curpos.y()+5);}if(b_leftflag){curpos.setX(curpos.x()-5);}if(b_rightflag){curpos.setX(curpos.x()+5);}ui->pushButton->move(curpos);}

我们通过isAutoRepeat函数判断某一个按键是否被单一按下,如果是,则直接移动按钮的位置。
否则我们根据按键的方向设置对应的标记,最后根据标记设置按钮的位置,以达到朝着两个方向的中间移动的效果。

总结

源码链接:
我们通过isAutoRepeat函数判断某一个按键是否被单一按下,如果是,则直接移动按钮的位置。
否则我们根据按键的方向设置对应的标记,最后根据标记设置按钮的位置,以达到朝着两个方向的中间移动的效果。

总结

源码链接:
https://gitee.com/secondtonone1/qt-learning-notes


http://www.ppmy.cn/devtools/166842.html

相关文章

doris:外表统计信息

外表统计信息的收集方式和收集内容与内表基本一致,目前支持对 Hive,Iceberg 和 Hudi 等外部表的收集。 自 2.0.3 版本之后,Hive 外表支持了自动和采样收集。 注意事项​ HMS 类型的 Iceberg 和 Hudi 外表,以及 JDBC 外表只支持手…

QT:串口上位机

创建工程 布局UI界面 设置名称 设置数据 设置波特率 波特率默认9600 设置数据位 数据位默认8 设置停止位 设置校验位 调整串口设置、接收设置、发送设置为Group Box 修改配置 QT core gui serialport 代码详解 mianwindow.h 首先在mianwindow.h当中定义一个串口指…

Github 2025-03-11 Python开源项目日报Top10

根据Github Trendings的统计,今日(2025-03-11统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目10TypeScript项目1免费API集合 创建周期:2900 天开发语言:Python协议类型:MIT LicenseStar数量:280943 个Fork数量:30691 次关注…

修改nginx配置,同一台服务器部署多个前端项目

修改nginx.conf 前提: 前端项目打包时,修改vue.config.js配置 module.exports defineConfig({publicPath: ./,...... )}举例 通过前缀区分多个前端项目 server {listen 443 ssl;server_name localhost;ssl_certificate /var/lib/thci/pki/ap…

高效管理应用资源--Qt资源系统详解

概述 在Qt应用程序开发中,资源管理是确保应用高效运行和易于维护的重要环节。Qt提供了强大的资源系统(Resource System),可以帮助开发者轻松管理和访问各种类型的资源文件,如图片、图标、翻译文件等。本文将详细介绍如何使用Qt的资源系统来有效管理应用资源,并通过示例代…

CTFHub技能树-Web-SSRF 解题方法

1、内网访问【左侧1】 在URL地址栏,输入:/?urlhttp://127.0.0.1/flag.php 注意:将默认页面的"?url"后的下划线“_"删掉。 127.0.0.1 和 localhost 都指的本机,均可访问。加上flag.php访问本机的php文件&#…

下载安装启动 VMware 个人免费版本

一、进入官网并登录账号下载软件 进入官网 [ https://www.vmware.com ],点击Products,将页面划到最底下,点击 “SEE DESKTOP HYPERVISORS”按钮。 然后点击 Desktop hypevisor ,会出现如下界面,可以根据自己的操作系…

opencv+ONNX模型的推理

如前文我们已经编译出带dnn模块的opencv,如果使用简易版的opencv虽然也可以加载onxx模型但是无法利用GPU进行并行计算,导致推理速度比较慢。所以既然都有这个RTX4060Ti的环境了,为什么不使用并行计算呢。 opencv加载的模型通常是ONXX模型&am…