Qt 事件系统

Qt 事件系统

题记:

突然想感慨几句话:
1、熟悉Qt的框架的确不是一朝一夕的事情。首先要懂得C++的语法规则、其次还需要不断摸索理解Qt的框架。
2、概念性的知识建构是是一个逐级递增的过程,这个过程就像打地基一样不断夯实。可能一本工具书,需要翻阅不仅仅是一遍两遍。看十遍的效果和看一遍的效果是不一样的。看五十遍和看十遍的效果更是不一样。
3、通过一些小小项目实践来体验编程了乐趣。

Qt的事件系统这部分内容稍显的复杂。本篇就来梳理梳理吧

1、QEvent 类关系图

Qt 事件系统
Qt中,事件作为上一个对象,继承QEvent类。常见的有QKeyEvent、鼠标事件QMouseEvent和定时器事件QTimerEvent 等。

2、Qt中的事件

事件是对各种应用程序需要知道的由应用程序内部或者外部产生的事情或者动作的通称。

事件和信号是不同层面的东西,发出者不同,作用也不同。

在Qt中,任何QObject 子类都可以接收和处理事件。

3、 事件的处理

一个事件由一个特定的QEvent子类来表示。

事件可以包含多个事件类型,比如鼠标事件可以分为鼠标按下,双击、和移动等多种操作。

5种处理事件的方法:

方法一:重新实现部件的paintEvent()、mousePressEvent()等事件处理方法。该方法最常用,但只能处理特定部件的特定事件

方法二:重新实现notify() 函数。这个函数功能强大,提供了完全的控制,可以在事件过滤器得到事件之前就捕获它们。但是,它一次只能处理一个事件。

方法三:向QApplication对象上安装事件过滤器。

方法四:重新实现event()函数。该函数可以在事件到达默认的事件处理函数之前获得该事件。

方法五:安装事件过滤器。

4、事件的传递

在每一个程序的main()函数的最后都会调用QApplication类的exec()函数,它会使Qt应用程序进入事件循环。

事件的传递过程:

  • 事件先递给指定窗口部件,或者说是先传递给获得焦点的窗口部件。
  • 如果该部件忽略掉该事件,该事件就会传递给这个部件的父部件。

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

5 、事件过滤器与事件的发送

Qt 提供了事件过滤器来在一个部件中监控其他多个部件的事件。

事件过滤器与其他部件不同,它不是一个类,二是由两个函数组成的一组操作。

事件过滤器用来完成一个部件对其他部件的事件的监视。

这两个函数分别是installFilter() 和eventFilter()

总结

关于事件内容的概述就这么多,具体的应用还是要结合实例来理解。