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槽函数,完成相应的操作。

相关推荐
故事和你9118 分钟前
洛谷-【图论2-1】树4
开发语言·数据结构·c++·算法·动态规划·图论
故事和你9120 分钟前
洛谷-【图论2-1】树1
开发语言·数据结构·c++·算法·深度优先·动态规划·图论
段ヤシ.22 分钟前
回顾Java知识点,面试题汇总Day5(持续更新)
java·开发语言
不会C语言的男孩32 分钟前
C++ SLTL编程
java·开发语言·c++
java修仙传34 分钟前
Java 实习日记:从业务表关系到节点价格分析接口改造
java·开发语言·实习
qq_4523962339 分钟前
第十四篇:《JMeter插件扩展:自定义函数与第三方插件》
开发语言·python·jmeter
敲代码的嘎仔1 小时前
力扣高频SQL基础50题详解
开发语言·数据库·笔记·sql·算法·leetcode·后端开发
码农-阿杰1 小时前
Java 线程等待唤醒机制深度解析:synchronized、ReentrantLock、LockSupport 底层实现对比
java·开发语言·c++
赤水无泪1 小时前
Qt 全模块汇总列表
开发语言·qt
yong99901 小时前
MATLAB仿真计算电磁波回波信号的技术路径与实现指南
开发语言·matlab