几乎当今所有的应用程序开发框架都是以事件为驱动的,Qt也不例外,Qt作为一个跨平台面向对象的应用程序开发框架,对不同操作系统的底层事件响应机制进行了统一的封装,并建立了提套完备的事件机制,形成了别具特色的Qt事件系统。
Qt事件机制
Qt作为一个事件驱动的工具集,其事件和事件派发起到了核心作用。在Qt的事件机制中,Qt将环境变化的信息组织成一个继承自QEvent的对象,并通过调用QObject::event()将之发送到继承自QObject的目标对象事件处理队列中,交由目标对象相应。
Qt事件的大致流程如下
(1)Qt的事件主循环exec()感知某个事件的发生
(2)Qt创建此事件多对应的对象(派生自QEvent),通过Qbject::event()进行派送
(3)事件的目的对象根据事件类型,将其分配给对应的事件处理函数。
(4)事件处理函数根据事件的需要对事件处理(如发射信号emit)。
一般情况下,事件来自底层窗口系统,Qt的主事件循环(QApplication::exec())从事件队列中取得本地窗口系统的事件,并将他们转变成QEvent,然后将转换好的时间发送给目标QObject,但是也有可能通过QApplication类的QApplication::senEventI()和QApplicaiton::postEvent()来手动发送事件。
根据事件的产生方式,Qt事件机制将事件分为一下三类:
(1)原生事件(spontaneous),由串口系统产生,他们被放大系统队列中,通过事件循环逐个处理。
(2)转发事件(Posted),由Qt的应用程序产生,他们被Qt组成队列,再通过事件循环处理。
(3)发送事件(Sent),由Qt或是应用程序产生,但他们被直接发送到目标对象。
根据事件的处理方式,上述三类事件又可分为异步处理事件(Spontaneous事件、Posted事件)和同步事件(Sent事件)。
由Qt的主事件循环处理的是异步事件,首先,事件循环处理所有的Posted事件,直到队列为空,然后处理所有的Spontaneus事件,最后它处理所有因为处理Spontaneous而产生的Posted事件。Sende事件并不在主事件循环中处理,他们都直接被发送到目标对象。