[Qt][Qt 事件][上]详细讲解

news2024/9/20 3:14:41

目录

  • 1.事件介绍
  • 2.事件的处理
  • 3.鼠标事件
  • 4.按键事件
  • 5.moveEvent
  • 6.resizeEvent


1.事件介绍

  • 事件是应⽤程序内部或者外部产⽣的事情或者动作的统称

  • 在Qt中使⽤⼀个对象来表⽰⼀个事件,所有的Qt事件均继承于抽象类QEvent

  • 事件是由系统或者Qt平台本⾝在不同的时刻发出的

    • 当⽤⼾按下⿏标、敲下键盘,或者是窗⼝需要重新绘制的时候,都会发出⼀个相应的事件
      • ⼀些事件是在⽤⼾操作时发出,如键盘事件、⿏标事件等
      • 另⼀些事件则是由系统本⾝⾃动发出,如定时器事件
  • 常⻅的Qt事件如下
    请添加图片描述

  • 常见事件描述

    事件名称描述
    ⿏标事件⿏标左键、⿏标右键、⿏标滚轮,⿏标的移动,⿏标按键的按下和松开
    键盘事件按键类型、按键按下、按键松开
    定时器事件定时时间到达
    进⼊离开事件⿏标的进⼊和离开
    滚轮事件⿏标滚轮滚动
    绘屏事件重绘屏幕的某些部分
    显⽰隐藏事件窗⼝的显⽰和隐藏
    移动事件窗⼝位置的变化
    窗⼝事件是否为当前窗⼝
    ⼤⼩改变事件窗⼝⼤⼩改变
    焦点事件键盘焦点移动
    拖拽事件⽤⿏标进⾏拖拽
  • 事件和信号槽有什么区别?

    • 事件本身是OS提供的机制,Qt同样把OS事件机制进行了封装,拿到了Qt中
    • 但是由于事件对应的代码编写起来不是很方便,Qt又对事件机制进行了更进一步的封装,就得到了信号槽
    • 综上:信号槽是对事件的进一步封装,事件是信号槽的底层机制
  • 何时用信号槽,何时用事件呢?

    • 实际Qt开发过程中,绝大部分和用户之间进行的交互都是通过"信号槽"来完成的
    • 有些特殊情况下,信号槽不一定能搞得定(用户的某个行为动作,Qt没有提供对应的信号),此时就需要通过重写事件处理函数的形式,来手动处理事件的响应逻辑
  • 信号槽和事件使用上的区别?

    • 信号槽通过connect()来关联代码和"事件"
    • 事件通过当前类重写某个事件处理函数 --> 多态机制
  • 事件存在的意义?

    • 开放事件机制给程序员,就可以根据实际需要,进行更深度的定制化DIY操作

2.事件的处理

  • 事件处理⼀般常⽤的⽅法为:重写相关的Event函数
  • 在Qt中,⼏乎所有的Event函数都是虚函数,所以可以重新实现
    • 如:在实现⿏标的进⼊和离开事件时,直接重新实现enterEvent()leaveEvent()即可

      请添加图片描述


3.鼠标事件

  • 在Qt中,⿏标事件是⽤QMouseEvent类来实现的
  • 当在窗⼝中按下⿏标或者移动⿏标时,都会产⽣⿏标事件
  • 鼠标左右键表示如下
    • Qt::LeftButton:⿏标左键
    • Qt::RightButton:⿏标右键
    • Qt::MidButton:⿏标滚轮
  • 鼠标点击事件:通过虚函数mousePressEvent()来捕获
    • 说明
      • 按下左键、右键、滚轮都能触发,有的鼠标带的前进后退侧键也能触发
      • 但是有的鼠标还提供了更多的按键,就不一定支持了
    • 示例
      void Label::mousePressEvent(QMouseEvent *event)
      {
      	if (event->button() == Qt::LeftButton) {} 
      	else if (event->button() == Qt::RightButton) {}
      	
      	// 当前 event 对象就包含了鼠标点击位置的坐标
      	// x() 和 y() 是以当前组件的左上角为原点,获取的坐标
      	qDebug() << event->x() << ", " << event->y();
      	
      	// globalX 和 globalY 是以屏幕左上角为原点, 获取的坐标.
      	qDebug() << event->globalX() << ", " << event->globalY();
      }
      
  • 鼠标释放事件:通过虚函数mouseReleaseEvent()来捕获
  • 鼠标双击事件:通过虚函数mouseDoubleClickEvent()来捕获
    • 说明:双击事件默认是会判定第二次单击为双击,所以会正常触发第一次单击事件
      • 有的程序,可能单机有一些逻辑,双击也有一些逻辑,如果编写程序时不注意,可能双击操作也会触发单击的逻辑,此时就会存在潜在的bug
  • 鼠标移动事件:通过虚函数mouseMoveEvent()来捕获,同时为了实时捕获⿏标位置信息,需要通过函数setMouseTracking()追踪⿏标的位置
    • 说明setMouseTracking()默认是false,需要设置为true,才能实时捕获⿏标位置信息,否则只有当⿏标按下时才能捕获其位置信息
      • 因为鼠标移动不同于鼠标按下,随便移动一下鼠标,就会产生出大量的鼠标移动事件
      • 当进行捕获事件的时候,尤其是在进行复杂逻辑的时候,程序负担很重,很容易产生卡顿之类的情况
      • Qt为了保证程序的流畅性,默认情况不会对鼠标移动进行追踪,所以鼠标移动的时候不会调用mouseMoveEvent()
    • 示例
      // 构造函数中
      {
          // 把这个选项设置为 true, 才能够追踪鼠标的移动位置.
          this->setMouseTracking(true);
      }
      
      void Widget::mouseMoveEvent(QMouseEvent* event)
      {
          qDebug() << event->x() << event->y();
      }
      
  • 滚轮事件:通过QWheelEvent类来实现的,滚轮滑动的距离可以通过delta()获取
    • 函数原型int QGraphicsSceneWheelEvent::delta() const
    • 说明:其中返回值代表滚轮滑动的距离
      • 正数表⽰滚轮相对于⽤⼾向前滑动
      • 负数表⽰滚轮相对于⽤⼾向后滑动
    • 示例
      void Widget::wheelEvent(QWheelEvent *event)
      {
          qDebug() << event->delta();
      }
      

4.按键事件

  • 怎样获取到键盘按键?
    • 方式一QShortCut:通过信号槽封装的机制,获取键盘按键
    • 方式二:站在更底层的角度,通过事件获取到当前用户键盘按下的情况
  • Qt中的按键事件是通过QKeyEvent类来实现的
  • 当键盘上的按键被按下或者被释放时,键盘事件便会触发
  • 单个按键:重写keyPressEvent()虚函数
    • 示例
      void Widget::keyPressEvent(QKeyEvent *event)
      {
          if (event->key() == Qt::Key_A){}
      }
      
  • 组合按键:同样重写keyPressEvent()虚函数,但是可以搭配Qt::KeyboardModifier中定义的在处理键盘事件时对应的修改键
    • 在Qt中,键盘事件可以与修改键⼀起使⽤,以实现⼀些复杂的交互操作
      • Qt::NoModifier:⽆修改键
      • Qt::ShiftModifier:Shift 键
      • Qt::ControlModifier:Ctrl 键
      • Qt::AltModifier:Alt 键
      • Qt::MetaModifier:Meta键
        • 在Windows上指Windows键,在MacOS上指Command键
      • Qt::KeypadModifier:使⽤键盘上的数字键盘进⾏输⼊时,NumLock键处于打开状态
      • Qt::GroupSwitchModifier ⽤于在输⼊法组之间切换
    • 示例
      void Widget::keyPressEvent(QKeyEvent *event)
      {
          if (event->key() == Qt::Key_A && 
      	    event->modifiers() == Qt::ControlModifier) 
          {}
      }
      

5.moveEvent

  • moveEvent:窗口移动时触发的事件
  • 示例
    void Widget::moveEvent(QMoveEvent *event)
    {
        qDebug() << event->pos();
    }
    

6.resizeEvent

  • resizeEvent:窗口大小改变时触发的事件
  • 示例
    void Widget::resizeEvent(QResizeEvent *event)
    {
        qDebug() << event->size();
    }
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2039850.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深入理解C#中的yield关键字:提升迭代性能与效率

文章目录 前言一、yield return二、yield break总结 前言 在C#中&#xff0c;yield 关键字是特别用于迭代器块和方法中的&#xff0c;它允许你逐个返回序列中的元素&#xff0c;而不是一次性返回整个集合。使用 yield 可以显著提高处理大数据集或进行复杂迭代时的性能和内存效率…

【数据结构初阶】队列经典习题两道

hello&#xff01; 我是云边有个稻草人 目录 一、用队列实现栈 二、用栈实现队列 Relaxing Time &#xff01; 正文开始—— 一、用队列实现栈 225. 用队列实现栈 - 力扣&#xff08;LeetCode&#xff09; 根据题目要求&#xff0c;我们要用两个队列来实现栈的相关功能&…

虚拟机上使用Ubuntu1804上编译qt5.12.9部署到jetson nano上

开发qt界面&#xff0c;基于Qt5.12.9&#xff0c;开发环境使用虚拟机加载Ubuntu1804&#xff0c;开发完成后的qt程序最后部署到jetson nano上&#xff0c;使用的通用编译器是gcc-linaro-7.5.0-2019.12-x86_64_aarch64-linux-gnu 安装编译器 本文中直接将gcc-linaro-7.5.0-2019.…

汇昌联信做拼多多店铺如何运营?

汇昌联信如何在拼多多上运营店铺&#xff0c;是许多电商新手和希望扩展市场的商家所关注的问题。在这个快速发展的电商平台上&#xff0c;掌握正确的运营策略&#xff0c;对于提升店铺销量、增强品牌影响力至关重要。接下来&#xff0c;我们将详细探讨如何有效运营拼多多店铺。…

Angular由一个bug说起之九:AWS S3 文件下载问题

引言 在现代 Web 开发中&#xff0c;我们经常需要处理来自全球不同地区的数据&#xff0c;这包括文件名中可能包含的非拉丁文字符。最近&#xff0c;在一个项目中&#xff0c;我们遇到了一个与 Amazon S3 服务相关的挑战&#xff0c;涉及到文件名编码的处理。当从 S3 下载文件…

Redis分布式部署方式-主从复制

分布式部署Redis方式 分布式系统&#xff0c;涉及到一个非常关键的问题&#xff1a;单点问题 单点问题&#xff1a;如果某个服务器&#xff0c;只有一个节点&#xff08;只搞一个物理服务器&#xff0c;来部署这个服务器程序&#xff09;&#xff0c;会遇到一些困难&#xff…

多线程学习之ThreadLocal详细笔记

ThreadLocal详细笔记 一、ThreadLocal的基本概念二、ThreadLocal的独特性2.1 数据访问方式2.2 线程安全实现2.3 适用场景 三、ThreadLocal 的简单使用四、ThreadLocal 的工作原理五、ThreadLocal和内存泄漏的关系5.1 ThreadLocalMap的Entry的Key设计成弱引用5.2 弱引用会导致内…

超简单4行代码-STM32F103的HAL实现有源蜂鸣器报警

1、概述 在嵌入式项目开发中&#xff0c;使用蜂鸣器作为简单的报警或提示装置非常常见。根据不同的应用场景&#xff0c;我们可能会选择有源蜂鸣器或无源蜂鸣器。本文将重点介绍如何通过STM32F103系列单片机&#xff0c;利用HAL库&#xff0c;仅通过4行代码实现对有源蜂鸣器的…

django学习入门系列之第九点《初识MySQL》

文章目录 9.1 初识网站9.2 初识MySQL下载安装创建配置文件初始化启动MySQL服务进入mysql查看已有文件夹退出&#xff08;关闭连接&#xff09;忘记密码 往期回顾 9.1 初识网站 Python相关:基础、函数、数据类型、面向、模块。前端开发直观:HTML、CSS、JavaScript、jQuery:[静态…

【运维】JetBrains Gateway (Pycharm) SSH免密连接,改为免密连接

一直要求输入密码&#xff0c;很烦人&#xff1a; 如何免密连接&#xff1f; 1 重新打开gateway&#xff0c;来到这个界面点新建连接&#xff1a; 2 点这里设置&#xff1a; 3 在这一页&#xff0c;你可以改你的所有配置&#xff0c;只要设置为password并且保存密码&…

详解Redis 高可用的方式 Redis Cluster

Redis 高可用方式 Redis 提供了多种高可用性方案&#xff0c;主要包括以下几种方式&#xff1a; 主从复制&#xff08;Replication&#xff09; 主从复制是最基本的高可用性方案&#xff0c;通过将数据从一个主节点复制到多个从节点来实现数据的冗余和读写分离。主节点负责所…

数据结构--数据结构概述

一、数据结构三要素 1. 数据的逻辑结构 数据的逻辑结构是指数据元素之间的关系和组织方式&#xff0c;通常分为线性结构和非线性结构。 线性结构&#xff1a;例如线性表&#xff0c;其中数据元素按照顺序排列&#xff0c;彼此之间存在一对一的关系。 非线性结构&#xff1a;…

android车载手机互联投屏新专题-实战作业布置

背景&#xff1a; 学习了马哥的投屏实战开发课程后&#xff0c;大家都可以实现如下图一样的手机车机多端互联的投屏场景。 即已经实现了手机和车机投屏互动&#xff0c;车机上手机画面屏幕可以与手机实体屏幕一样就是常见的Mirror模式&#xff0c;如果不一样就是课程里面讲的扩…

解析网络流量管理方案:简化基于云的DNS负载均衡

数字化时代&#xff0c;网络规模和流量需求的增长&#xff0c;催生了用户对可用性的需求、管理员对更好的访问和管理等需求。在大型的网络应用中&#xff0c;为保障站点的稳定性&#xff0c;会为服务或站点提供多台服务器&#xff0c;以平均分配每台服务器上的压力&#xff0c;…

上门做饭小程序项目源码功能介绍

上门做饭小程序通常包含以下功能&#xff0c;以便用户方便地享受到上门做饭的服务&#xff1a; 用户注册与登录&#xff1a;允许用户创建账户并登录&#xff0c;管理个人信息和偏好。 菜品浏览与选择&#xff1a;提供各种菜品的列表或菜单&#xff0c;用户可以浏览菜品详情、价…

C++STL详解(五)——list类的具体实现

一.本次所需实现的三个类及其成员函数接口 链表首先要有结点&#xff0c;因此我们需要实现一个结点类。 链表要有管理结点的结构&#xff0c;因此我们要有list类来管理结点。 链表中还要有迭代器&#xff0c;而迭代器的底层其实是指针。但是我们现有的结点类无法完成迭代器的…

在VB.net中,对数据排名次,用LINQ、SortedSet,还是用SortedList速度快

标题 在VB.net中&#xff0c;对数据排名次&#xff0c;用LINQ、SortedSet&#xff0c;还是用SortedList速度快 正文 在VB.NET中&#xff0c;选择最适合你需求的排序和索引方法时&#xff0c;需要考虑到数据的规模、是否需要频繁地更新数据结构、以及是否只需要排序结果或还需要…

【Hadoop】建立圈内组件的宏观认识

01存储02计算03调度04其他05回忆 众多组件们构建了大规模分布式计算和存储平台。本文介绍Hadoop生态圈中各个组件的主要功能和作用&#xff0c;辅助学者理解每个组件的定位和用途&#xff0c;从而建立对圈内组件的宏观认识。梳理清楚HDFS、MapReduce、YARN、Hive、HBase、Spark…

【大模型系列篇】Transformers综述--邱锡鹏

论文标题&#xff1a;A Survey of Transformers 论文作者&#xff1a;Tianyang Lin, Yuxin Wang, Xiangyang Liu, Xipeng Qiu 论文链接&#xff1a;https://arxiv.org/abs/2106.04554 Transformer 在许多人工智能领域&#xff08;如自然语言处理、计算机视觉和音频处理&#…

【区块链+金融服务】山西省信易贷平台 | FISCO BCOS应用案例

2022 年 8 月 8 日&#xff0c;山西省发展改革委按照国家的顶层设计&#xff0c;指导山西股权交易中心建设山西省信易贷平台&#xff0c;包 括三个子平台&#xff1a;一是建设集金融产品超市、融资需求精准匹配、融资监测等于一体的山西省融资综合信用服务平台&#xff1b; 二是…