成立做网站的公司有哪些,互联网产品开发,广州线上推广公司,免费投放广告平台1、QAbstractEventDispatcher内容较少#xff0c;其主要是定义了一些注册接口#xff0c;如定时器事件、socket事件、注册本地事件、自定义事件等等。其源码如下#xff1a; 其主要定义了大量的纯虚函数#xff0c;具体的实现会根据不同的系统平台#xff0c;实现对应的方…1、QAbstractEventDispatcher内容较少其主要是定义了一些注册接口如定时器事件、socket事件、注册本地事件、自定义事件等等。其源码如下 其主要定义了大量的纯虚函数具体的实现会根据不同的系统平台实现对应的方法我主要使用windows编程其主要是在QEventDispatcherWin32中实现QEventDispatcherWin32对象的创建主要是在QCoreApplicationPrivate中创建其代码如下 另外QEventDispatcherWin32对象一个线程中只有一个事件分配器QThreadData中会保存QAbstractEventDispatcher对象。
2、QEventDispatcherWin32源码中主要实现a.定时功能由于定时功能需要使用系统时钟应该会调用winAPI函数); b.socket事件c.qt和windows系统之间的事件交互 QEventDispatcherWin32的构造函数体为空直接忽略
上一节介绍QCoreApplication类时发现其调用exec函数最终会定位到QAbstractEventDispatcher的processEvents函数其是QAbstractEventDispatcher最重要的函数之一 由于internalHwnd为空所以会先调用createInternalHwnd函数其中定义了windows系统和qt系统交互的方式 qt_create_internal_window中创建了一个看不见的windows窗口并注册其事件监听回调函qt_internal_proc 此函数主要是调用TranslateMessage(msg);及 DispatchMessage(msg);函数时执行此方法当消息类型为WM_QT_SENDPOSTEDEVENTS类型时调用sendPostedEvents函数
注sendPostedEvents函数会调用到QCoreApplicationPrivate类中的sendPostedEvents函数从而转到qt内部的事件处理。
installMessageHook()函数定义了WH_GETMESSAGE类型的钩子函数其主要时监听peekMessage函数的返回值或者监听键盘、鼠标等输入事件qt_GetMessageHook函数为对应的钩子函数其实现如下 其主要是检测消息队列中是否还存在有定时器事件、鼠标、键盘等输入事件的消息如果不存在会投递一个WM_QT_SENDPOSTEDEVENTS消息
继续分析processEvents函数中的剩余内容 此处主要是检测消息对列中是否有消息需要处理如果存在消息取出队列中的消息 如果存在对应的消息 检测消息类型如果是WM_QT_SENDPOSTEDEVENT类型则将对应的标志位seenWM_QT_SENDPOSTEDEVENTS标志位置为true如果为WM_TIMER事件类型检测是否
已被处理过如果处理过直接跳过进入下次循环如果没有处理加入processedTimers列表中并稍后会被处理
检测事件类型是否为WM_QUIT事件如果是WM_QUIT事件则直接退出 检测本地事件过滤器是否处理此事件如果没有处理则翻译事件、派发事件并最终转入到qt_internal_proc函数中处理 以上部分代码暂时没有看太懂后续会接着研究。
至此QAbstractEventDispatcher最重要的processEvent函数已分析完毕
总结
1、qt通过注册一个隐藏的windows窗体类主要时qt_internal_proc钩子函数接收windows系统中的消息事件并调用QCoreApplicationPrivate类中的sendPostedEvent函数切入到qt的事件循环中
2、qt通过processEvents函数不断捡取windows系统中的消息、自定义消息并通过windowsAPI中的TranslateMessage函数翻译消息DispatchMessage派发消息将事件转入到qt_internal_proc中
注关于定时器、socket等事件会放到后续中分析下一节会切入到QCoreApplication中分析qt内部的事件循环是如何处理的主要是熟知的sendEvent、postEvent函数的实现