【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实现网络数据解析的方法总结

《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义

C++如何通过Qt反射机制实现数据类序列化

《C++如何通过Qt反射机制实现数据类序列化》在C++工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作,所以本文就来聊聊C++如何通过Qt反射机制实现数据类序列化吧... 目录设计预期设计思路代码实现使用方法在 C++ 工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作。由于数据类

Qt中QGroupBox控件的实现

《Qt中QGroupBox控件的实现》QGroupBox是Qt框架中一个非常有用的控件,它主要用于组织和管理一组相关的控件,本文主要介绍了Qt中QGroupBox控件的实现,具有一定的参考价值,感兴趣... 目录引言一、基本属性二、常用方法2.1 构造函数 2.2 设置标题2.3 设置复选框模式2.4 是否

QT进行CSV文件初始化与读写操作

《QT进行CSV文件初始化与读写操作》这篇文章主要为大家详细介绍了在QT环境中如何进行CSV文件的初始化、写入和读取操作,本文为大家整理了相关的操作的多种方法,希望对大家有所帮助... 目录前言一、CSV文件初始化二、CSV写入三、CSV读取四、QT 逐行读取csv文件五、Qt如何将数据保存成CSV文件前言

Qt中QUndoView控件的具体使用

《Qt中QUndoView控件的具体使用》QUndoView是Qt框架中用于可视化显示QUndoStack内容的控件,本文主要介绍了Qt中QUndoView控件的具体使用,具有一定的参考价值,感兴趣的... 目录引言一、QUndoView 的用途二、工作原理三、 如何与 QUnDOStack 配合使用四、自

Qt spdlog日志模块的使用详解

《Qtspdlog日志模块的使用详解》在Qt应用程序开发中,良好的日志系统至关重要,本文将介绍如何使用spdlog1.5.0创建满足以下要求的日志系统,感兴趣的朋友一起看看吧... 目录版本摘要例子logmanager.cpp文件main.cpp文件版本spdlog版本:1.5.0采用1.5.0版本主要

利用Python快速搭建Markdown笔记发布系统

《利用Python快速搭建Markdown笔记发布系统》这篇文章主要为大家详细介绍了使用Python生态的成熟工具,在30分钟内搭建一个支持Markdown渲染、分类标签、全文搜索的私有化知识发布系统... 目录引言:为什么要自建知识博客一、技术选型:极简主义开发栈二、系统架构设计三、核心代码实现(分步解析

Python FastAPI+Celery+RabbitMQ实现分布式图片水印处理系统

《PythonFastAPI+Celery+RabbitMQ实现分布式图片水印处理系统》这篇文章主要为大家详细介绍了PythonFastAPI如何结合Celery以及RabbitMQ实现简单的分布式... 实现思路FastAPI 服务器Celery 任务队列RabbitMQ 作为消息代理定时任务处理完整

Linux系统中卸载与安装JDK的详细教程

《Linux系统中卸载与安装JDK的详细教程》本文详细介绍了如何在Linux系统中通过Xshell和Xftp工具连接与传输文件,然后进行JDK的安装与卸载,安装步骤包括连接Linux、传输JDK安装包... 目录1、卸载1.1 linux删除自带的JDK1.2 Linux上卸载自己安装的JDK2、安装2.1

C#如何动态创建Label,及动态label事件

《C#如何动态创建Label,及动态label事件》:本文主要介绍C#如何动态创建Label,及动态label事件,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#如何动态创建Label,及动态label事件第一点:switch中的生成我们的label事件接着,