Qt | 事件系统 QEvent

简介: 了解Qt的事件系统及事件的传递。

前言:

在Qt中,事件是被作为一个对象的,继承自QEvent类。事件和信号不是一个概念,比如说单击一下界面上的按钮,这时产生一个鼠标事件(QMouseEvent),这个事件不是按钮产生的,但是因为按钮被按下,所以按钮会发射一个单击信号(clicked()),这个信号是按钮产生的。

事件的流程是: 发生一个事件时,就会产生一个QEvent对象,这个QEvent对象会传递给当前部件的event()函数。如果当前部件没有安装事件过滤器eventFilter,则会被event函数放到相应的事件函数(xxxEvent)中去。

事件主要分为两类:

  1. 在与用户交互时发生(比如按下鼠标:mousePressEvent);
  2. 系统自动发生(比如定时器事件:timerEvent);

QObject子类实例都可以接收和处理事件。

事件的处理:

当我们接收到一个事件,需要对事件进行处理时,一般会有下面这几种方法:

  • 方法一:重新实现事件函数。 例如重新实现部件的paintEvent()、mousePressEvent()等事件处理函数。这时最常用的一种方法,不过只能用来处理特定部件的特定事件。
    例如: void paintEvent(QPaintEvent *event);
  • 方法二:重新实现notify()函数。 这个函数的功能非常强大,提供了完全的控制,可以在事件过滤器得到事件之前就获得它们。但是它一次只能处理一个事件。
  • 方法三:向QApplication对象上安装事件过滤器。 因为一个程序只有一个QApplication对象,所以这样实现的功能与使用notify()函数是相同的,优点是可以同时处理多个事件。
  • 方法四:重新实现event()函数。 QObject类的event()函数可以在事件到达默认的事件处理函数之前获得该事件。
    例如: bool event(QEvent *event);
  • 方法五:在对象上安装事件过滤器。 使用事件过滤器可以在一个界面类中同时处理不同子部件的不同事件。
    例如: bool eventFilter(QObject *obj, QEvent *event);

最常用的方法是方法一、其次是方法五。因为方法二需要继承自QApplication类,方法三要使用一个全局的事件过滤器,这会减缓事件的传递,所以这两个方法虽然很强大,但是很少用。

事件的传递:

一个多层级的窗口中,事件是先传递给指定窗口部件的,也就是先传递给获得焦点的窗口部件。但是如果该部件的事件函数中调用了ignore()函数忽略掉这个事件,那么这个事件会传递给这个部件的父部件。

重新实现事件处理函数时,一定要调用父类的相应事件处理函数来实现默认操作。例如:

  • 在paintEvent()函数末尾要调用:QWidget::paintEvent(event);
  • 在event()函数末尾要调用:return QWidget::event(event);
  • 在eventFilter()函数末尾调用:return QWidget::eventFilter(obj, event);

事件的传递顺序是: 先是事件过滤器,然后是焦点部件的event()函数,最后是焦点部件的事件处理函数;如果焦点部件忽略了该事件,那么会执行父部件的事件处理函数。

目录
相关文章
|
2月前
|
存储 Windows
(13) Qt事件系统(two)
文章详细介绍了Qt事件系统,包括事件分发、自定义事件、事件传播机制、事件过滤以及事件与信号的区别。
93 3
(13) Qt事件系统(two)
|
2月前
|
编解码 程序员
(12)Qt事件系统(one)
本文详细介绍了Qt事件系统,包括各种系统事件、鼠标事件、键盘事件、定时器等的处理方法和示例代码。
83 0
(12)Qt事件系统(one)
|
4月前
|
存储 C++
【C++】C++ 基于QT实现散列表学生管理系统(源码+数据+课程论文)【独一无二】
【C++】C++ 基于QT实现散列表学生管理系统(源码+数据+课程论文)【独一无二】
【C++】C++ 基于QT实现散列表学生管理系统(源码+数据+课程论文)【独一无二】
|
4月前
|
API
Qt绘图之Paint系统
Qt绘图之Paint系统
62 2
|
4月前
|
开发者
【Qt 学习笔记】Qt系统相关 | Qt事件 | 事件的介绍及基本概念
【Qt 学习笔记】Qt系统相关 | Qt事件 | 事件的介绍及基本概念
209 4
|
4月前
从源码角度分析Qt元对象系统2
从源码角度分析Qt元对象系统
56 0
|
4月前
|
存储
从源码角度分析Qt元对象系统1
从源码角度分析Qt元对象系统
80 0
|
4月前
|
数据安全/隐私保护
【qt】获取主机信息系统
【qt】获取主机信息系统
18 0
|
5月前
|
开发者
Qt中的事件该如何学习?(附带案例)
事件是Qt中比较重要的一部分,在初期如果理解不当学习可能会比较困难,这里提一嘴当初教我的那位老师水平是真的高,让我很轻易的就理解了事件的概念。 在平时我们见到那些界面上的某些快捷键就有可能是事件做的,例如ESC关闭窗口,Enter提交或者登录这种类似的,这也是事件的强大之处。
121 0
|
5月前
|
数据安全/隐私保护 C++ 计算机视觉
Qt(C++)开发一款图片防盗用水印制作小工具
文本水印是一种常用的防盗用手段,可以将文本信息嵌入到图片、视频等文件中,用于识别和证明文件的版权归属。在数字化和网络化的时代,大量的原创作品容易被不法分子盗用或侵犯版权,因此加入文本水印成为了保护原创作品和维护知识产权的必要手段。 通常情况下,文本水印可以包含版权声明、制作者姓名、日期、网址等信息,以帮助识别文件的来源和版权归属。同时,为了增强防盗用效果,文本水印通常会采用字体、颜色、角度等多种组合方式,使得水印难以被删除或篡改,有效地降低了盗用意愿和风险。 开发人员可以使用图像处理技术和编程语言实现文本水印的功能,例如使用Qt的QPainter类进行文本绘制操作,将文本信息嵌入到图片中,
188 1
Qt(C++)开发一款图片防盗用水印制作小工具