【Qt】Qt系统 | Qt事件 按键事件

2024-08-23 20:04
文章标签 系统 qt 事件 按键

本文主要是介绍【Qt】Qt系统 | Qt事件 按键事件,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 一. 事件介绍
  • 二. 事件的处理
    • 1. 移入/移出事件
    • 2. 鼠标点击事件
  • 三. 按键事件

一. 事件介绍

事件是应用程序内部或者外部产生的事情或者动作的统称。在 Qt 中使用一个对象来表示一个事件。所有的 Qt 事件均继承于抽象类 QEvent
事件是由系统或者 Qt 平台本身在不同时刻发出,当用户按下鼠标,敲下键盘,或者是窗口需要重新绘制的时候,都会发出一个相应的事件。
一些事件是在用户操作时发出的,如键盘事件、鼠标事件等,另一些事件则是由系统本身自动发出,如定时器事件。常见的 Qt 事件如下:
在这里插入图片描述
常见事件描述:

事件名称描述
鼠标事件(QMouseEvent)鼠标左键、右键、滚轮,鼠标的移动,鼠标按键的按下和松开
键盘事件(QKeyEvent)按键类型,按键按下,按键松开
定时器事件(QTimerEvent)定时时间到达
进入离开事件鼠标的进入和离开
绘屏事件重绘屏幕的某些部分
显示隐藏事件窗口的显示和隐藏
移动事件窗口位置的变化
窗口事件是否为当前串口
大小改变事件控件大小改变
焦点事件键盘焦点移动
拖拽事件(QDropEvent)用鼠标进行拖拽

信号槽:用户进行的各种操作,都有可能产生信号,可以给某个信号指定槽函数。当信号触发时,就能自动调用对应的槽函数
事件:用户进行的各种操作,也有可能产生事件,我们同样也可以给事件关联上处理函数,当事件触发时,会执行关联函数

事件是信号槽的底层机制,信号槽是事件的进一步封装
实际 Qt 开发,绝大部分和用户之间的交互都是使用 信号槽机制,但也有无法实现的需求(Qt 没有提供对应的信号),此时就可以使用 事件 手动处理响应逻辑

二. 事件的处理

事件处理,是通过 多态 机制,事件处理函数都是虚函数,这些虚函数都封装在 Qt 已有的类。
实现逻辑如下:

  1. 创建子类,继承自 Qt 已有的类
  2. 在子类中重写父类的事件处理函数
  3. 后续时间触发过程中,就会通过多态机制,执行到重写的事件处理函数

1. 移入/移出事件

代码示例:通过继承 QLabel类,并重写鼠标进入和鼠标离开 Label 区域的事件处理函数

API说明
void QWidget::leaveEvent(QEvent *event)当鼠标离开控件区域时触发事件
void QWidget::enterEvent(QEvent *event)当鼠标进入控件区域触发时触发事件
  1. 新建 QWidget 项目,通过设计 UI 文件,添加一个QLabel在这里插入图片描述
  2. 在项目中新建一个类:MyLabel,并继承自 QLabel在这里插入图片描述
  3. 重写 事件处理函数 mylabel.h在这里插入图片描述
    mylabel.cpp在这里插入图片描述
  4. 在 Qt Designer 界面,将 QLabel 提升为 MyLabel在这里插入图片描述在这里插入图片描述
  5. 运行程序,将鼠标移入和移除文本标签,观察效果在这里插入图片描述

2. 鼠标点击事件

代码示例:当鼠标在标签区域内点击时,获取鼠标坐标

涉及的API

API说明
mousePressEvent(QMouseEvent *event)鼠标在控件区域内点击
event->x()/event()->y()不同的事件有不同的属性,此处的 x 和 y 是鼠标相对于控件的坐标
event->globalX()/event->globalY()此处的 x 和 y 是鼠标相对于屏幕的坐标

mylabel.cpp

void MyLabel::mousePressEvent(QMouseEvent *event)
{qDebug() << "鼠标按下,相对于控件:(" << event->x() << "," << event->y() << ")";qDebug() << "鼠标按下,相对于控件:(" << event->globalX() << "," << event->globalY() << ")";qDebug() << "---------------------------";
}

运行结果如下:
在这里插入图片描述


QMouseEvent类 可以通过 button() 函数获取鼠标如何触发该事件(左键/右键…)
函数原型如下:

Qt::MouseButton button()

MouseButton 是一个枚举类
在这里插入图片描述
常用的:

  • LeftButton:左键
  • RightButton:右键
  • MidButton:滚轮键按下

代码示例:点击鼠标左键和右键,显示不同文本

mylabel.cpp

void MyLabel::mousePressEvent(QMouseEvent *event)
{if(event->button() == Qt::LeftButton)qDebug() << "鼠标左键按下";else if(event->button() == Qt::RightButton)qDebug() << "鼠标右键按下";
}

运行结果如下:
在这里插入图片描述

三. 按键事件

Qt 中的按键事件是通过 QKeyEvent类 实现的,当键盘上的按键按下或者被释放时,键盘事件便会触发

通过 QKeyEvent类key() 获取通过哪个按键触发该事件
Qt 通过枚举类Qt::Key区分各个按键
在这里插入图片描述
事件处理函数为:
在这里插入图片描述

代码示例:单个按键按下

void Widget::keyPressEvent(QKeyEvent *event)
{if(event->key() == Qt::Key_A)qDebug() << "按键A被按下";else if(event->key() == Qt::Key_B)qDebug() << "按键B被按下";else if(event->key() == Qt::Key_C)qDebug() << "按键C被按下";
}

运行结果如下:
在这里插入图片描述


代码示例:组合按键
Qt 使用 Qt::KeyboardModifier定义在处理键盘事件时对应的修改键。键盘事件可以与修改键一起使用,以实现一些复杂的交互操作
在这里插入图片描述

修改键说明
Qt::NoModifier无修改键
Qt::ShiftModifierShift键
Qt::ControlModifierCtrl键
Qt::AltModfierAlt键
Qt::MetaDifierMeta键(在Windows上指Windows键,在macOS上指Command键)
Qt::KeypadModifier使用键盘上的数字键盘输入时,Num Lock键处于打开状态
Qt::GroupSwithModifier用于在输入法组之间切换

代码示例:判断是否按下组合键

void Widget::keyPressEvent(QKeyEvent *event)
{//组合键按下if(event->key() == Qt::Key_A && event->modifiers() == Qt::ShiftModifier)qDebug() << "Shift + A被按下";else if(event->key() == Qt::Key_B && event->modifiers() == Qt::ControlModifier)qDebug() << "Ctrl + B被按下";else if(event->key() == Qt::Key_C && event->modifiers() == Qt::AltModifier)qDebug() << "Alt + C被按下";
}

运行结果如下:
在这里插入图片描述

结束语
感谢你的阅读
如果觉得本篇文章对你有所帮助的话,不妨点个赞支持一下博主,拜托啦,这对我真的很重要。
在这里插入图片描述

这篇关于【Qt】Qt系统 | Qt事件 按键事件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1100371

相关文章

QT Creator配置Kit的实现示例

《QTCreator配置Kit的实现示例》本文主要介绍了使用Qt5.12.12与VS2022时,因MSVC编译器版本不匹配及WindowsSDK缺失导致配置错误的问题解决,感兴趣的可以了解一下... 目录0、背景:qt5.12.12+vs2022一、症状:二、原因:(可以跳过,直奔后面的解决方法)三、解决方

JWT + 拦截器实现无状态登录系统

《JWT+拦截器实现无状态登录系统》JWT(JSONWebToken)提供了一种无状态的解决方案:用户登录后,服务器返回一个Token,后续请求携带该Token即可完成身份验证,无需服务器存储会话... 目录✅ 引言 一、JWT 是什么? 二、技术选型 三、项目结构 四、核心代码实现4.1 添加依赖(pom

基于Python实现自动化邮件发送系统的完整指南

《基于Python实现自动化邮件发送系统的完整指南》在现代软件开发和自动化流程中,邮件通知是一个常见且实用的功能,无论是用于发送报告、告警信息还是用户提醒,通过Python实现自动化的邮件发送功能都能... 目录一、前言:二、项目概述三、配置文件 `.env` 解析四、代码结构解析1. 导入模块2. 加载环

linux系统上安装JDK8全过程

《linux系统上安装JDK8全过程》文章介绍安装JDK的必要性及Linux下JDK8的安装步骤,包括卸载旧版本、下载解压、配置环境变量等,强调开发需JDK,运行可选JRE,现JDK已集成JRE... 目录为什么要安装jdk?1.查看linux系统是否有自带的jdk:2.下载jdk压缩包2.解压3.配置环境

Linux查询服务器系统版本号的多种方法

《Linux查询服务器系统版本号的多种方法》在Linux系统管理和维护工作中,了解当前操作系统的版本信息是最基础也是最重要的操作之一,系统版本不仅关系到软件兼容性、安全更新策略,还直接影响到故障排查和... 目录一、引言:系统版本查询的重要性二、基础命令解析:cat /etc/Centos-release详

更改linux系统的默认Python版本方式

《更改linux系统的默认Python版本方式》通过删除原Python软链接并创建指向python3.6的新链接,可切换系统默认Python版本,需注意版本冲突、环境混乱及维护问题,建议使用pyenv... 目录更改系统的默认python版本软链接软链接的特点创建软链接的命令使用场景注意事项总结更改系统的默

Qt中实现多线程导出数据功能的四种方式小结

《Qt中实现多线程导出数据功能的四种方式小结》在以往的项目开发中,在很多地方用到了多线程,本文将记录下在Qt开发中用到的多线程技术实现方法,以导出指定范围的数字到txt文件为例,展示多线程不同的实现方... 目录前言导出文件的示例工具类QThreadQObject的moveToThread方法实现多线程QC

在Linux系统上连接GitHub的方法步骤(适用2025年)

《在Linux系统上连接GitHub的方法步骤(适用2025年)》在2025年,使用Linux系统连接GitHub的推荐方式是通过SSH(SecureShell)协议进行身份验证,这种方式不仅安全,还... 目录步骤一:检查并安装 Git步骤二:生成 SSH 密钥步骤三:将 SSH 公钥添加到 github

Linux系统中查询JDK安装目录的几种常用方法

《Linux系统中查询JDK安装目录的几种常用方法》:本文主要介绍Linux系统中查询JDK安装目录的几种常用方法,方法分别是通过update-alternatives、Java命令、环境变量及目... 目录方法 1:通过update-alternatives查询(推荐)方法 2:检查所有已安装的 JDK方

Linux系统之lvcreate命令使用解读

《Linux系统之lvcreate命令使用解读》lvcreate是LVM中创建逻辑卷的核心命令,支持线性、条带化、RAID、镜像、快照、瘦池和缓存池等多种类型,实现灵活存储资源管理,需注意空间分配、R... 目录lvcreate命令详解一、命令概述二、语法格式三、核心功能四、选项详解五、使用示例1. 创建逻