9.1事件机制与原理分析


***【在线视频教程】***

好文章,来自【福优学苑@音视频+流媒体】

9.1事件机制与原理分析

9.1.1 什么是Qt事件驱动?

        我们在写Qt工程类项目的时候都会发现,主程序里面都有这么一段代码:

image.png

好文章,来自【福优学苑@音视频+流媒体】

int main(int argc, char *argv[])

{

    QApplication a(argc, argv);

    MainWindow w;

    w.show();

 

    return a.exec();

}

       实际上a.exec()便是Qt程序进入事件消息循环,


9.1.2 图形界面应用程序的消息处理模型


好文章,来自【福优学苑@音视频+流媒体】

特点:

  • 基于操作系统才能运行

  • GUI应用程序提供的功能必须由用户触发

  • 用户操作界面时操作系统是第一个感知的 

  • 系统内核的消息通过事件处理转变成QT的信号

9.1.3 Qt中的事件处理

(1)在Qt中,事件被封装成一个个对象,所有的事件均继承自抽象类QEvent.    

         事件处理的核心包括事件①产生、②分发、③接受和处理

①事件的产生

谁来产生事件? 

最容易想到的是我们的输入设备,比如键盘、鼠标产生的

keyPressEvent,keyReleaseEvent,

mousePressEvent,mouseReleaseEvent事件

(被封装成QMouseEvent和QKeyEvent)。


②Qt中事件的分发

谁来负责分发事件?

对于non-GUI的Qt程序,是由QCoreApplication负责将QEvent分发给QObject的子类-Receiver. 

对于Qt GUI程序,由QApplication来负责

 好文章,来自【福优学苑@音视频+流媒体】


③事件的接受和处理

谁来接受和处理事件?

答案是QObject

类是整个Qt对象模型的心脏,事件处理机制是

  1. 内存管理、

  2. 内省intropection、

  3. 事件处理制

)之一。

任何一个想要接受并处理事件的对象均须继承自QObject,可以选择重载QObject::event()函数或事件的处理权转给父类。

9.1.4 QObject的内省机制

所谓内省是指面向对象语言的一种在运行期间查询对象信息的能力, 比如如果该语具有运行期间检查对象型别的能力,那么我们称它是型别内省(type intropection)的,型别内省可以用来实施多态。


c++的内省比较有限,它仅支持上面所说的型别内省, C++的型别内省是通过运行时类型识别(RTTI)。Qt拓展了C++的内省机制,(实际上,它并没有采用c++的RTTI),而是提供了更为强大的元对象(meta object)机制,来实现内省。接下来,就让我们看看,Qt是如何扩展c++内省机制的。

好文章,来自【福优学苑@音视频+流媒体】

要深刻理解Qt的内省机制,首先理解QObject,QObject类是整个Qt对象模型的心脏,Qt对象模型最为核心的功能是提供一种无缝的对象通讯机制,即就是我们所熟知的信号和槽。好文章,来自【福优学苑@音视频+流媒体】

9.1.5 Qt平台将系统产生的消息转变成Qt事件

  1. Qt事件是一个QEvent(或子类)的对象

  2. 有时一个事件包含多个事件类型,比如鼠标事件又可以分为鼠标按下、双击、和移动多种操作

  3. 事件类型由QEvent类的枚举型QEvent::Type来表示,可由帮助文档进行查询

  4. Qt事件用于描述程序内部或外部发生的对应动作(描述的是操作系统发生来的消息,一个系统消息对应着一个消息事件)

  5. 任意QObject对象都具备时间处理的能力

image.png

 

QEvent及其子类对象

note:QEvent子类可以表示一个事件,但并不能处理这个事件


Qt 程序需要在main()函数创建一个QApplication对象,然后调用它的exec()函数。

这个函数就是开始 Qt 的事件循环。


在执行exec()函数之后,程序将进入事件循环来监听应用程序的事件。

当事件发生时,Qt 将创建一个事件对象。Qt 中所有事件类都继承于QEvent。


在事件对象创建完毕后,Qt 将这个事件对象传递给QObject的event()函数。

event()函数并不直接处理事件,而是将这些事件对象按照它们不同的类型,分发给不同的事件处理器(event handler)。

如上所述,event()函数主要用于事件的分发。

好文章,来自【福优学苑@音视频+流媒体】

9.1.6 GUI应用程序的事件处理方式

  • Qt事件产生后会立即被分发到QWidget对象(QObject的子类,如按键QPushButton对象等)

  • QWidget对象其内部会有一个event(QEVent*)函数被调用,进行事件处理

  • event()根据事件类型调用不同的事件处理函数(默认的子函数)

  • 在事件处理函数中发送Qt中预定义的信号

  • 调用信号关联的槽函数


好文章,来自【福优学苑@音视频+流媒体】
***【在线视频教程】***