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

相关推荐
我是菜鸟0713号9 小时前
Qt 中 OPC UA 通讯实战
开发语言·qt
JCBP_9 小时前
QT(4)
开发语言·汇编·c++·qt·算法
Brookty9 小时前
【JavaEE】线程安全-内存可见性、指令全排序
java·开发语言·后端·java-ee·线程安全·内存可见性·指令重排序
百锦再10 小时前
[特殊字符] Python在CentOS系统执行深度指南
开发语言·python·plotly·django·centos·virtualenv·pygame
Anson Jiang10 小时前
浏览器标签页管理:使用chrome.tabs API实现新建、切换、抓取内容——Chrome插件开发从入门到精通系列教程06
开发语言·前端·javascript·chrome·ecmascript·chrome devtools·chrome插件
会开花的二叉树10 小时前
继承与组合:C++面向对象的核心
java·开发语言·c++
潮汐退涨月冷风霜11 小时前
数字图像处理(1)OpenCV C++ & Opencv Python显示图像和视频
c++·python·opencv
长河12 小时前
Java开发者LLM实战——LangChain4j最新版教学知识库实战
java·开发语言
第七序章12 小时前
【C++STL】list的详细用法和底层实现
c语言·c++·自然语言处理·list
Cyan_RA912 小时前
SpringMVC @RequestMapping的使用演示和细节 详解
java·开发语言·后端·spring·mvc·ssm·springmvc