当前位置: 首页 > news >正文

【Qt】事件处理

文章目录

  • 事件
  • 鼠标事件
  • 键盘事件


事件

事件是应用程序内部或者外部产生的事情或者动作的统称。在 Qt 中使用⼀个对象来表示⼀个事件。所有的 Qt 事件均继承于抽象类 QEvent

事件是由系统或者 Qt 平台本⾝在不同的时刻发出的。⼀些事件是在用户操作时发出,如键盘事件、鼠标事件等,另⼀些事件则是由系统自动发出,如定时器事件。常见的 Qt 事件如下:

  • QMouseEvent 鼠标事件

  • QKeyEvent 键盘事件

Qt在上级控件中定义了一些事件处理函数,这是一些虚函数,如(例如 QObject::event()QWidget::mousePressEvent())。对象通过继承上级基类,并重写事件处理函数来处理事件。

事件与信号槽机制

信号槽实际上是Qt为了方便事件处理的实现,抽象出来的一种机制,也就是说事件是信号槽的底层实现,我们在开发中往往使用信号槽居多,事件机制适用于更底层,更贴近系统层面的事件处理。


鼠标事件

QWidget中关于鼠标的事件

Events说明
mousePressEvent(QMouseEvent *event)点按鼠标
mouseReleaseEvent(QMouseEvent *event)释放鼠标
mouseDoubleClickEvent(QMouseEvent *event)双击鼠标
mouseMoveEvent(QMouseEvent *event)移动鼠标
enterEvent(QEvent *event)鼠标进入控件
leaveEvent(QEvent *event)鼠标离开控件
wheelEvent(QWheelEvent *event)滑动鼠标滑轮

QMouseEvent类中一些常用接口

接口说明
QPoint pos()获取鼠标所在坐标 (当前控件内)
int x()横坐标
int y()纵坐标
Qt::MouseButton button()返回造成此次事件发生的鼠标按键 (Qt::MouseButton鼠标按键枚举类型)
QPoint globalPos()获取鼠标所在坐标 (全屏内)
class Label : public QLabel//自定义Label类,继承自QLabel,重写事件处理函数以自定义事件处理逻辑
{Q_OBJECT
public:Label(QWidget* parent);//重写事件处理函数void mousePressEvent(QMouseEvent *event);void mouseReleaseEvent(QMouseEvent *event);void mouseDoubleClickEvent(QMouseEvent *event);void mouseMoveEvent(QMouseEvent *event);void wheelEvent(QWheelEvent *event);
};
#include "label.h"
#include <QDebug>
#include <QMouseEvent>Label::Label(QWidget* parent) : QLabel(parent)
{}void Label::mousePressEvent(QMouseEvent *event)
{if(event->button() == Qt::LeftButton){qDebug() << "点击了左键";}else if(event->button() == Qt::RightButton){qDebug() << "点击了右键";}qDebug() << event->pos();
}void Label::mouseReleaseEvent(QMouseEvent *event)
{qDebug() << event->x() << " " << event->y();
}void Label::mouseDoubleClickEvent(QMouseEvent *event)
{(void)event;qDebug() << "双击鼠标";
}void Label::mouseMoveEvent(QMouseEvent *event)
{
/*    If mouse tracking is switched off, mouse move events only occur if a mouse button is pressed while the mouse is being moved.
*/qDebug() << "move: " << event->pos();
}

特别地,为了提高效率,mouseMoveEvent事件并不会鼠标一移动就触发,那样会发生非常多次!进行以下设置会打开鼠标追踪,不限制鼠标移动事件的触发。

this->setMouseTracking(true);

鼠标滑轮事件

void Label::wheelEvent(QWheelEvent *event)
{//使用鼠标滑轮,改变字体大小QFont font = this->font();int newPointSize = font.pointSize() + event->delta() / 10;if(newPointSize > 0){font.setPointSize(newPointSize);this->setFont(font);}
}

delta()函数返回滑轮滚动的距离。向前滚动返回正数,向后滚动返回负数。一个滚动单位的数值是120。


键盘事件

QWidget中关于键盘的事件

Events说明
keyPressEvent(QKeyEvent *event)点击键盘按键
keyReleaseEvent(QKeyEvent *event)释放键盘按键

注意,控件必须被聚焦时 (focus on),键盘事件才会发生。

  • 单个按键
void Widget::keyPressEvent(QKeyEvent *event)
{qDebug() << event->key();//获取键盘输入的按键是哪个,可以直接使用值,//也可以使用Qt中的内置按键枚举类型Keyif(event->key() == Qt::Key_A){qDebug() << "按下了A键";}else if(event->key() == Qt::Key_B){qDebug() << "按下了B键";}
}
  • 组合键

    Qt::KeyboardModifier 中定义了在处理键盘事件时对应的修改键。在 Qt 中,键盘事件可以与修改键⼀起使⽤,以实现⼀些复杂的交互操作。

image-20240717162435710

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 图论建模技巧搜集
  • Matlab学习笔记1
  • 扩容升级丨极海正式推出G32A1465系列汽车通用MCU,驱动智驾再进阶
  • 【转盘案例-弹框-修改Bug-完成 Objective-C语言】
  • 【中项】系统集成项目管理工程师-第2章 信息技术发展-2.2新一代信息技术及应用-2.2.1物联网与2.2.2云计算
  • arm 内联汇编基础
  • 如何在Linux上部署Ruby on Rails应用程序
  • 相同IP地址仿真测试
  • Ruby 循环
  • 单机、集群、分布式服务器比较:
  • 无人机侦察:二维机扫雷达探测设备技术详解
  • 【学习笔记】虚幻SkeletalMesh学习(一)基础介绍
  • CTF-Web习题:[BJDCTF2020]Mark Loves cat
  • AWS全服务历史年表:发布日期、GA和服务概述一览(一)
  • 鸿蒙开发StableDiffusion绘画应用
  • 9月CHINA-PUB-OPENDAY技术沙龙——IPHONE
  • 【跃迁之路】【585天】程序员高效学习方法论探索系列(实验阶段342-2018.09.13)...
  • 345-反转字符串中的元音字母
  • HashMap剖析之内部结构
  • JavaScript-Array类型
  • JavaScript中的对象个人分享
  • java架构面试锦集:开源框架+并发+数据结构+大企必备面试题
  • KMP算法及优化
  • Linux后台研发超实用命令总结
  • Promise面试题2实现异步串行执行
  • RedisSerializer之JdkSerializationRedisSerializer分析
  • Spark in action on Kubernetes - Playground搭建与架构浅析
  • 机器学习中为什么要做归一化normalization
  • 精益 React 学习指南 (Lean React)- 1.5 React 与 DOM
  • 算法---两个栈实现一个队列
  • 温故知新之javascript面向对象
  • 延迟脚本的方式
  • 在Unity中实现一个简单的消息管理器
  • LIGO、Virgo第三轮探测告捷,同时探测到一对黑洞合并产生的引力波事件 ...
  • 你学不懂C语言,是因为不懂编写C程序的7个步骤 ...
  • 智能情侣枕Pillow Talk,倾听彼此的心跳
  • (16)Reactor的测试——响应式Spring的道法术器
  • (C语言)求出1,2,5三个数不同个数组合为100的组合个数
  • (DenseNet)Densely Connected Convolutional Networks--Gao Huang
  • (二)fiber的基本认识
  • (附源码)ssm基于jsp的在线点餐系统 毕业设计 111016
  • (机器学习-深度学习快速入门)第三章机器学习-第二节:机器学习模型之线性回归
  • (四)图像的%2线性拉伸
  • (转)PlayerPrefs在Windows下存到哪里去了?
  • (转)socket Aio demo
  • *p++,*(p++),*++p,(*p)++区别?
  • .gitignore文件---让git自动忽略指定文件
  • .NET 5种线程安全集合
  • .NET Framework、.NET Core 、 .NET 5、.NET 6和.NET 7 和.NET8 简介及区别
  • .NET MVC第三章、三种传值方式
  • .net 写了一个支持重试、熔断和超时策略的 HttpClient 实例池
  • .NET 中使用 Mutex 进行跨越进程边界的同步
  • .NET8使用VS2022打包Docker镜像
  • .stream().map与.stream().flatMap的使用
  • [1525]字符统计2 (哈希)SDUT