QT Embedded二三事之QEventLoop.doc

  1. 1、本文档共5页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
事件是GUI应用的核心概念,GUI应用就是通过执行一个个事件来完成其功能的。围绕事件而设计的事件循环,事件分发,事件截取(hook),这些都是GUI Framework的核心部分和运行的基础,是把其它所有对象联接起的纽带。在QT中,事件循环和事件机制被封装在QEventLoop中。本文就简略介绍一下,QT中的事件运行机制。 1.事件分类 QT中的事件主要有如下几种: (1)QWSEvent和QWSCommand 这是QWSClient和QWSServer通讯所使用的事件,QWS Client向QWS Server发送QWSCommand请求,QWS Server向QWS Client返回QWSEvent响应。 QWSEvent和QWSCommand是client与server通讯所使用的socket事件转换来的。 QWSEvent事件保存在QApplication::Data的QPtrListQWSEvent queue中。 QWSCommand保存在QWSServer的QPtrListQWSCommandStruct commandQueue中; (2)QEvent QEvent是在QWS Client内部各个QObject使用的事件。封装了各种窗口消息:QShowEvent,QFocusEvent,QMoveEvent等。 QEvent主要使用sendEvent和postEvent发送出去的,sendEvent是同步消息,相当同步调用,不会经过事件循环,不保存,直接调用QObject::event()。postEvent是异步调用,先把事件放在globalPostedEvents队列中,在QEventLoop::processEvents中,会循环检查globalPostedEvents。 (3)QSocket事件 QSocket事件是类型为QEvent::SockAct的QEvent,但是其处理方法和一般的QEvent不一样。 QSocket事件可以用来处理进程通讯,QWSEvent/QWSCommand事件就是通过QSocket传调的,QSocket由QEventLoop管理。 (4)QTimer事件 和QSocket事件一样QTimer就是类型为QEvent::Timer的QEvent,但是其处理方法和一般的QEvent不一样。 QTimer事件放在全局对象:static TimerList *timerList。 2.QSocket和QEventLoop QSocket和一个socket fd绑定在一起,每个socket fd都可以三种动作:read, write,exception。每一个动作由一个QSocketNotifier来封装。 QSocketNotifies通过QEventLoop::registerSocketNotifier注册到QEventLoop中,通过QEventLoop::unregisterSocketNotifier取消注册。 QEventLoop使用QSockNot封装一个QSocketNotifier和相应的操作类型,装同属于一类型操作的QSockNot封装到QSockNotType中,建立起同一类操作的select_fds队列,直接用于select使用。 QEventLoop根据socket fd的三种操作(read/write/exceptions)共保存三类QSockNotType。 3.QEventLoop::processEvents QEventLoop::processEvents是一次事件循环调用,分别查看各类事件列队是否由事件。QApplication::exec/QEventLoop::exec/QEventLoop::enterLoop就是循环调用QEventLoop::processEvents。 下面针对QEventLoop::processEvents的实现,说明事件的分发过程。 bool QEventLoop::processEvents( ProcessEventsFlags flags ) { // process events from the QWS server int nevents = 0; ...... // handle gui and posted events if (qt_is_gui_used ) { //a.首先执行globalPostedEvents队列中的事件,这些事件都是通过QApplication::postEvent或QThread::postEvent发送的 QApplication

文档评论(0)

xcs88858 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档