Qt事件处理

事件机制:

  1. Qt中定义的事件是一个从QEvent类继承下来的,它表示应用程序内部或者外部发生某些应用程序必须知道的事情
  2. Qt使用一个事件队列 对所有发出的事件进行维护,当新的事件产生时,会被追加到事件队列的尾部 。前一个事件完成后,取出后面的事件进行处理。但是,必要的时候,Qt 的事件也可以不进入事件队列,而是直接处理。
  3. 在Qt内部,Qt通过由函数****QApplication::exec()****函数启动的主事件循环从系统事件队列中抓取属于本程序事件并转化为QEvent对象

事件类图:

QMouseEvent: 鼠标点击

QKeyEvent: 键盘事件

QPaintEvent: 背景重绘事件

基于事件如何被产生与分发,可以把事件分为三类:

1.Spontaneous 事件:

由窗口系统产生,它们被放到系统队列中,通过事件循环逐个处理。

例如: 鼠标,键盘,移动

2.Posted 事件:

由Qt或是应用程序产生,它们被Qt组成队列,再通过事件循环 处理。例如: update(),paintEvent()

3.Sent 事件: 发送后立即实现

由Qt或是应用程序产生,但它们被直接发送到目标对象。 repaint()

QEvent对象

QEvent对象是所有事件对象的基类,因此有必要了解该对象构成函数:

-enum Type

标识事件类型

-Type type () const

调用该函数,返回事件发生事件的类型(该类型为枚举)

常用的事件类型

常用的Qt事件类:

Qt为多数事件定义了特殊的类:

  1. QMouseEvent 鼠标事件
  2. QKeyEvent 键盘事件
  3. QResizeEvent窗体缩放事件
  4. QPaintEvent 窗体重绘事件
  5. QCloseEvent 窗体关闭事件: 可以询问是否确定要关闭或关闭后要做的事
  6. QFocusEvent 部件获得焦点事件

事件处理方法:

Qt提供了几种处理事件的方法:

  1. 重新实现特定的事件处理器
  2. 重新实现QObject::event()函数
  3. 继承QApplication并重新实现notify()函数

所有的事件查看方法: 所有的事件都是 虚函数->需要进行事件重写

编写事件步骤:

  1. 查看对应事件的函数
  2. 复制对应事件的函数的首部至protected:中
  3. 进行虚函数事件进行重写

重绘事件的重写:

1.缩放

三种设置窗口布局的方式:

重载event()函数

通过重载event()函数,我们可以在事件被特定的事件处理函数处理之前(象keyPressEvent())处理它. 比如, 当我们想改变tab键的默认动作时,一般要重载这个函数. 在处理一些不常见的事件当我们重载event()函数时, 需要调用父类的event()函数来处理我们不需要处理或是不清楚如何处理的事件.

事件过滤器

Qt事件模型中有一项非常强大的功能是一个Object实例可以监视另外一个QObject实列中的事件.实现方法就是在目标对象安装事件过滤器.这样事件到打目标对象之前首先获得该事件.从而起到监视作用

事件过滤器的实现: 假设要用A (注册界面) 来监视过滤B (注册按钮) 的事件

  1. 调用B的installEventFilter( const QOject *obj ), 以A的指针 作为参数. 这样所有发往B的事件都将先由A的eventFilter()处理.
  2. A(注册页面 )要重载QObject::eventFilter()函数, 在eventFilter() 中书写对事件进行处理的代码.

信号与事件的区别:

  1. 信号是由对象产生的;
  2. 信号产生与否或者信号存不存在,对槽函数的行为不会产生影响
  3. 事件由对象处理 改写事件的处理函数,使程序的执行发生变化 重写信号是在事件处理过程产生的,

以点击按钮为例:

qt接收到一个鼠标事件,事件放在qt事件循环里面,进行事件分发,

以QPushButton为例:

按下这个按钮是先触发的是mousePressEvent事件,在事件源码中会发射pressed()信号,松开按钮又触发mouseReleaseEvent事件,在事件源码中发射released()信号和clicked()信号,clicked()信号发出后,触发对应的slots槽函数,完成相应的操作。

相关推荐
xiangyun612 小时前
C++ priority_queue 底层:手撕二叉堆与 Top K 问题
c++·算法·面试·stl·1024程序员节
坤坤子吖2 小时前
C++继承:友元、静态成员、多继承与组合
开发语言·c++·笔记·学习·1024程序员节
技术小甜甜2 小时前
【Cursor】Skill 被标黄色警告,怎么改成合格的 SKILL.md
开发语言·javascript·ai编程·cursor·1024程序员节·ai agent·skills
qz_Serene2 小时前
练习算法题:双指针 -cpp
c++·算法·leetcode·1024程序员节
扶尔魔ocy3 小时前
【C++开发】从裸指针到智能指针
c++·智能指针·1024程序员节
初阳7853 小时前
【基于Qt5仿音乐播放器(一)】——项目准备
qt·1024程序员节
小小龙学IT3 小时前
Python Polars 高性能数据处理引擎深度解析
开发语言·python·rust·1024程序员节
quantdash_cc3 小时前
如何利用标的信息为研究股票池补充名称和交易所信息?
开发语言·python·pandas·量化交易·1024程序员节·股票数据·quantdash
CRMEB系统商城4 小时前
家电零售的供应商协同与物流提效
java·开发语言·人工智能·小程序·1024程序员节
王大师王文峰4 小时前
Java+AI 面试题(二):业务场景设计 10 例【客服机器人、合同审查、Text2SQL、告警降噪、成本优化】场景题答法与追问链路
java·开发语言·人工智能