qt源码--事件系统

qt的事件传播主要依赖于QCoreApplication、QAbstractEventDispatcher(会根据不同的平台生成各自的处理对象)、QEvent(各种事件类型)等。

首先看下QCoreApplication的实现:

qt源码--事件系统_第1张图片

 qt源码--事件系统_第2张图片

 qt源码--事件系统_第3张图片

 qt源码--事件系统_第4张图片

 2、了解QCoreApplication的构造函数

qt源码--事件系统_第5张图片

 其构造函数主要是初始化QCoreApplicationPrivate对象,并调用QCoreApplicationPrivate的init函数;

qt源码--事件系统_第6张图片

 QCoreApplicationPrivate构造函数主要是初始化一些变量,其最主要的是创建了一个线程QThread,主线程theMainThread就是此时创建的。

解析来看下init函数:

qt源码--事件系统_第7张图片

qt源码--事件系统_第8张图片

 init函数中主要是创建eventDispatcher对象,其是qt事件分发的基础,windows和qt之间的事件交互主要是由eventDispatcher对象实现,后边会单独介绍;

至此QCoreApplication类创建完成。

2、熟悉qt应用的都知道,QCoreApplication创建完成后,会调用exec函数,开启qt的事件循环。exec函数实现如下:

qt源码--事件系统_第9张图片exec函数主要是生成了一个QEventLoop对象,并调用QEventLoop的exec函数,由此猜测,其事件循环主要实在QEventLoop对象中实现;QEventLoop中exec的实现如下:

qt源码--事件系统_第10张图片 分析此函数,发现其主要是通过while循环中调用processEvents函数,此exec函数会阻塞应用程序直到exit为false;其processEvents函数如下:

qt源码--事件系统_第11张图片

此函数会调用eventDispatcher的processEvents函数,processEvents函数会检测windows的事件如:鼠标事件、键盘点击等事件,后续会详细分析;

总结:

Qt事件循环机制主要是由QCoreApplication调用exec循环,然后在调用QEventLoop的exec函数,由QEventLoop的exec函数中调用eventDispatcher的processEvents函数来接收windows事件。大致如下:

qt源码--事件系统_第12张图片

 由于QCoreApplication的内容比较多,后续会在来分析sendEvent、postEvent等函数;下一篇会先着重分析下QAbstractEventDispatcher的功能。

你可能感兴趣的:(qt,开发语言)