【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

相关文章

Linux系统之主机网络配置方式

《Linux系统之主机网络配置方式》:本文主要介绍Linux系统之主机网络配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、查看主机的网络参数1、查看主机名2、查看IP地址3、查看网关4、查看DNS二、配置网卡1、修改网卡配置文件2、nmcli工具【通用

Linux系统之dns域名解析全过程

《Linux系统之dns域名解析全过程》:本文主要介绍Linux系统之dns域名解析全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、dns域名解析介绍1、DNS核心概念1.1 区域 zone1.2 记录 record二、DNS服务的配置1、正向解析的配置

Linux系统中配置静态IP地址的详细步骤

《Linux系统中配置静态IP地址的详细步骤》本文详细介绍了在Linux系统中配置静态IP地址的五个步骤,包括打开终端、编辑网络配置文件、配置IP地址、保存并重启网络服务,这对于系统管理员和新手都极具... 目录步骤一:打开终端步骤二:编辑网络配置文件步骤三:配置静态IP地址步骤四:保存并关闭文件步骤五:重

Qt 中 isHidden 和 isVisible 的区别与使用小结

《Qt中isHidden和isVisible的区别与使用小结》Qt中的isHidden()和isVisible()方法都用于查询组件显示或隐藏状态,然而,它们有很大的区别,了解它们对于正确操... 目录1. 基础概念2. 区别清见3. 实际案例4. 注意事项5. 总结1. 基础概念Qt 中的 isHidd

QT移植到RK3568开发板的方法步骤

《QT移植到RK3568开发板的方法步骤》本文主要介绍了QT移植到RK3568开发板的方法步骤,文中通过图文示例介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录前言一、获取SDK1. 安装依赖2. 获取SDK资源包3. SDK工程目录介绍4. 获取补丁包二

Qt把文件夹从A移动到B的实现示例

《Qt把文件夹从A移动到B的实现示例》本文主要介绍了Qt把文件夹从A移动到B的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录如何移动一个文件? 如何移动文件夹(包含里面的全部内容):如何删除文件夹:QT 文件复制,移动(

Windows系统下如何查找JDK的安装路径

《Windows系统下如何查找JDK的安装路径》:本文主要介绍Windows系统下如何查找JDK的安装路径,文中介绍了三种方法,分别是通过命令行检查、使用verbose选项查找jre目录、以及查看... 目录一、确认是否安装了JDK二、查找路径三、另外一种方式如果很久之前安装了JDK,或者在别人的电脑上,想

Linux系统之authconfig命令的使用解读

《Linux系统之authconfig命令的使用解读》authconfig是一个用于配置Linux系统身份验证和账户管理设置的命令行工具,主要用于RedHat系列的Linux发行版,它提供了一系列选项... 目录linux authconfig命令的使用基本语法常用选项示例总结Linux authconfi

Nginx配置系统服务&设置环境变量方式

《Nginx配置系统服务&设置环境变量方式》本文介绍了如何将Nginx配置为系统服务并设置环境变量,以便更方便地对Nginx进行操作,通过配置系统服务,可以使用系统命令来启动、停止或重新加载Nginx... 目录1.Nginx操作问题2.配置系统服android务3.设置环境变量总结1.Nginx操作问题

spring @EventListener 事件与监听的示例详解

《spring@EventListener事件与监听的示例详解》本文介绍了自定义Spring事件和监听器的方法,包括如何发布事件、监听事件以及如何处理异步事件,通过示例代码和日志,展示了事件的顺序... 目录1、自定义Application Event2、自定义监听3、测试4、源代码5、其他5.1 顺序执行