qt的事件传播主要依赖于QCoreApplication、QAbstractEventDispatcher(会根据不同的平台生成各自的处理对象)、QEvent(各种事件类型)等。
首先看下QCoreApplication的实现:
2、了解QCoreApplication的构造函数
其构造函数主要是初始化QCoreApplicationPrivate对象,并调用QCoreApplicationPrivate的init函数;
QCoreApplicationPrivate构造函数主要是初始化一些变量,其最主要的是创建了一个线程QThread,主线程theMainThread就是此时创建的。
解析来看下init函数:
init函数中主要是创建eventDispatcher对象,其是qt事件分发的基础,windows和qt之间的事件交互主要是由eventDispatcher对象实现,后边会单独介绍;
至此QCoreApplication类创建完成。
2、熟悉qt应用的都知道,QCoreApplication创建完成后,会调用exec函数,开启qt的事件循环。exec函数实现如下:
exec函数主要是生成了一个QEventLoop对象,并调用QEventLoop的exec函数,由此猜测,其事件循环主要实在QEventLoop对象中实现;QEventLoop中exec的实现如下:
分析此函数,发现其主要是通过while循环中调用processEvents函数,此exec函数会阻塞应用程序直到exit为false;其processEvents函数如下:
此函数会调用eventDispatcher的processEvents函数,processEvents函数会检测windows的事件如:鼠标事件、键盘点击等事件,后续会详细分析;
总结:
Qt事件循环机制主要是由QCoreApplication调用exec循环,然后在调用QEventLoop的exec函数,由QEventLoop的exec函数中调用eventDispatcher的processEvents函数来接收windows事件。大致如下:
由于QCoreApplication的内容比较多,后续会在来分析sendEvent、postEvent等函数;下一篇会先着重分析下QAbstractEventDispatcher的功能。