Qt事件机制

Qt事件的产生

事件是由窗口系统或Qt自身产生的,用以响应所发生的各类事情。当用户点击鼠标按键时,就可以产生一个鼠标事件。大多数事件是作为用户动作的响应而产生的,但是也有一些例外,比如像定时器事件,则是由系统独立产生的。

Qt事件的分发

对于Qt应用程序,由QCoreApplication对象开启主事件循环后,会不断地获取本地窗口系统事件队列中的事件并将其转换成QEvent对象,然后发送给具体QObject对象进行处理。

Qt事件的接收和处理

QObject对象调用QObject:: event函数接收该QObject对象所有的事件并分发给具体的类型的处理函数,例如mousePressEvent等。若该对象对事件不进行处理,会传递给其父对象进行处理,直到顶层窗口。

分析

以上简述了Qt事件处理的过程,接下来根据定时器事件的函数调用情况,具体分析一下事件分发处理的过程,下图为定时器事件触发调用函数堆栈的情况(下文中行号对应图中行号):

24-28行:Qt的GUI应用程序的main函数默认会创建一个QApplication对象调用其exec函数,该函数开启了应用程序的主事件循环。查看Qt源码发现QApplication::exec()内部依次调用了QGuiApplication::exec()和QCoreApplication::exec()并最终调用QEventLoop::exec (),调用关系如下图所示:

23行:QEventLoop::exec(ProcessEventsFlags flags=AllEvents)其内部循环调用QEventLoop::processEvents(ProcessEventsFlags flags = AllEvents)来处理事件。当退出函数exit()被调用时,终止循环。
22-15行:processEvents函数将事件派发给与平台相关的QAbstractEventDispatcher对象(QEventDispatcherWin32派生自QAbstractEventDispatcher)。该对象提供管理Qt事件队列的接口,并从窗口系统或其他源中接收事件,转换成QEvent对象然后发送给QCoreApplication对象进行处理或继续传递。
14-11行:QCoreApplicantion对象会将QEvent事件发送给具体QObject对象。
10-9行:QObject对象使用event函数接收所有事件,将QEvent对象分发到具体类型的处理函数,本例发给了timerEvent函数进行处理。QEvent类是所有事件类的基类,仅包含事件的类型。在具体处理函数可以将QEvent转换成对应的子类对象,子类包含描述该事件的一些参数,例如QMouseEvent包含了鼠标的位置等信息。
8行:timerEvent函数发出定时器超时timeout信号。
7-1行:是Qt信号槽的机制。

总结

Qt事件处理过程大致如下:
1、 Qt应用开启事件循环。
2、 事件循环从本地窗口系统取出事件进行处理,创建QEvent对象发送给QCoreApplication对象。
3、 QCoreApplication对象将QEvent对象发送给QObejct对象。
4、 QObejct对象调用event函数将QEvent对象分发到具体类型处理函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值