`
美丽的小岛
  • 浏览: 296968 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

Qt Event Dispatcher<转>

    博客分类:
  • QT
 
阅读更多

Qt中的事件大致可分为3类:

Spontaneous events

从系统得到的消息:鼠标按键、键盘按键、定时器事件等。转化为QEvent后被Qt事件系统依次处理

Posted events

由Qt或应用程序直接生成,放入Qt消息队列
QCoreApplication::postEvent()

Sent events

由Qt或应用程序产生,不放入队列直接被派发和处理
QCoreApplication::sendEvent()

本文中,先简单看一下后两种,然后重点看看第一种。

Sent events

比如,发送按键"X"的事件到 mainWin 窗口。

QKeyEvent event(QEvent::KeyPress, Qt::Key_X, Qt::NoModifier, "X", 0
);
QApplication::sendEvent(mainWin, &event);

如果没有过滤器的话,这其实就是直接调用 mainWin 的 keyPressEvent()函数。

(图片来源:http://www.slideshare.net/mariusbu/qt-widgets-in-depth,下同)


 这个东西不涉及事件队列、事件循环等等东西。但是事件过滤在这个过程中正常起作用。而且除过滤器外,下面三个函数在派生类中都可以被覆盖(以处理这个事件):

  • QApplication::notify()
  • QWidget::event()
  • QWidget::keyPressEvent()

Posted events

比如,同样是发送按键"X"的事件到 mainWin 窗口,我们可以使用postEvent()。

 

QApplication::postEvent(mainWin, new QKeyEvent(QEvent::KeyPress, Qt::Key_X, Qt::NoModifier, "X", 0
));

这会将该事件放入Qt自己的事件队列中,事件循环QEventLoop空闲时会判断该队列是否为空。最终使用 sendEvent() 依次派发事件队列中的这些事件。

也可以手动使用

  • QCoreApplication::sendPostedEvents()

清空当前线程事件队列(即派发队列中的事件)

注意:每一个线程有一个事件队列。

Spontaneous events

系统底层事件是通过 QAbstractEventDispatcher 整合进Qt的事件循环的。

Event dispatcher接受窗口系统以及其他源中的事件。它对事件的传递提供了一种精细控制的能力。

QAbstractEventDispatcher

  • QEventDispatcherUNIX
    • QEventDispatcherX11
    • QEventDispatcherQWS
    • QEventDispatcherQPA
  • QEventDispatcherGlib
    • QGuiEventDispatcherGlib
    • QWSEventDispatcherGlib
  • QEventDispatcherWin32
    • QGuiEventDispatcherWin32
  • QEventDispatcherMac
  • ...

这堆东西还挺多,不过下面三个属于QtCore模块

QEventDispatcherGlib

使用glib事件循环,有助于和Gtk的集成

QEventDispatcherUNIX

默认的glib不可用时,就用这个喽

QEventDispatcherWin32

Qt 创建一个带回调函数的隐藏窗口来处理事件。

我们能看的到的就是,它们提供

  • Timer
  • SockerNotifer

的注册、反注册功能。并将系统底层对应事件转换成Qt事件。


 其他的属于QtGui模块。就是和窗口系统(重绘、移动等等事件)以及键鼠事件有关了。

参考

  • 大小: 6.7 KB
  • 大小: 10.3 KB
  • 大小: 16.2 KB
分享到:
评论

相关推荐

    ORACLE精品脚本笔记

    &lt;br&gt;&lt;br&gt;此值大于0.5时,参数需加大 &lt;br&gt;&lt;br&gt;select sum(wait)/sum(totalq) "dispatcher waits" from v$queue where type='dispatcher'; &lt;br&gt;select count(*) from v$dispatcher; &lt;br&gt;select servers_highwater ...

    基于MyEclipse搭建maven+springmvc整合图文教程(含源码0

    &lt;servlet-name&gt;dispatcher&lt;/servlet-name&gt; &lt;servlet-class&gt;org.springframework.web.servlet.DispatcherServlet&lt;/servlet-class&gt; &lt;init-param&gt; &lt;param-name&gt;contextConfigLocation&lt;/param-name&gt; &lt;param-...

    Blitz:一个基于spring的宁静的Java框架,

    #Blitz Blitz 是一个开源的基于Servlet 规范和Spring规范的Restful响应框架。通过配置Filter Bean 的方式介入处理请求。 ... &lt;dispatcher&gt;REQUEST&lt;/dispatcher&gt; &lt;dispatcher&gt;FORWARD&lt;/dispatch

    jaxrs-api,javax.ws.rs.Path;

    &lt;servlet-class&gt;org.jboss.resteasy.plugins.server.servlet.HttpServlet30Dispatcher&lt;/servlet-class&gt; &lt;/servlet&gt; &lt;servlet-mapping&gt; &lt;servlet-name&gt;Resteasy&lt;/servlet-name&gt; &lt;url-pattern&gt;/app/service/*...

    Struts2整合SiteMesh技巧

    &lt;filter-class&gt;org.apache.struts2.dispatcher.ActionContextCleanUp&lt;/filter-class&gt; filter&gt; &lt;filter&gt; &lt;filter-name&gt;sitemesh&lt;/filter-name&gt; &lt;filter-class&gt;...

    解决struts2.1.6+spring+hibernate 中文乱码

    &lt;filter-class&gt;org.springframework.web.filter.CharacterEncodingFilter&lt;/filter-class&gt; &lt;init-param&gt; &lt;param-name&gt;encoding&lt;/param-name&gt; &lt;param-value&gt;GBK&lt;/param-value&gt; &lt;/init-param&gt; &lt;init-param...

    struts-2.3.4.1所需的jar文件

    &lt;filter-name&gt;struts2&lt;/filter-name&gt; &lt;filter-class&gt; org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter &lt;/filter-class&gt; &lt;/filter&gt; &lt;filter-mapping&gt; &lt;filter-name&gt;struts2&lt;/filter-...

    OA_struts2_hibernate3_spring2.5.rar

    &lt;result name="success" type="dispatcher"&gt;/org/index.jsp&lt;/result&gt; &lt;result name="select"&gt;/org/select.jsp&lt;/result&gt; &lt;/action&gt; &lt;action name="add_input" class="orgAction" method="add"&gt; ...

    Spring MVC Demo

    &lt;servlet-name&gt;Dispatcher&lt;/servlet-name&gt; &lt;servlet-class&gt;org.springframework.web.servlet.DispatcherServlet&lt;/servlet-class&gt; &lt;!--servlet的参数配置,查找controller位置的xml文件配置,此参数指定了...

    kola-signals:在 Typescript 中实现的简单信号 - 为 U 静态类型!

    Dispatcher &lt; string&gt; = new signals . Dispatcher &lt; string&gt; ( ) ;var receiver = ( msg : string ) =&gt; { console . log ( "message received!" , msg ) ;}messenger . listen ( receiver ) ;messenger . d

    生活轨迹SSH服务端

    &lt;filter-class&gt;org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter&lt;/filter-class&gt; &lt;/filter&gt; &lt;filter-mapping&gt; &lt;filter-name&gt;struts2&lt;/filter-name&gt; &lt;url-pattern&gt;/*&lt;/url-pattern&gt; ...

    Jeyy:个人作品: 轻量级的Mvc 框架

    &lt;servlet&gt;dispatcher&lt;/servlet&gt; &lt;!-- 配置核心控制器 --&gt; &lt;servlet&gt;cn.northpark.jeyy.servlet.JeyyServlet&lt;/servlet&gt; &lt;init&gt; &lt;param&gt;template&lt;/param&gt; &lt;!-- 配置选择的模板引擎,可以Jsp

    dispatcher 源码详解

    javaweb项目 DispatcherServle源码详解 web.xml 配置

    eventstore2:用于构建事件源Java应用程序的框架

    通过Akka进行异步执行和集群支持投影,CommandHandlers和Sagas的注释驱动配置持久性事件和网络事件的Json或二进制(Kryo)序列化Maven依赖 &lt;dependency&gt; &lt;groupId&gt;no.ks&lt;/groupId&gt; &lt;artifactId&gt;eventstore2&lt;/...

    struts-2.5.13

    &lt;filter-class&gt;org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter&lt;/filter-class&gt; &lt;!-- 引用个具体类文件 --&gt; &lt;/filter&gt; &lt;filter-mapping&gt; &lt;filter-name&gt;struts2&lt;/filter-name&gt; ...

    用Struts2新建一个应用的方法步骤

    例如:login,在此页面&lt;body&gt;&lt;/body&gt;之间输入 &lt;form action="login.action" method="post"&gt; username: &lt;input type="text" name="username"&gt; &lt;br&gt; password: &lt;input type="password" name="password...

    javaWed笔记

    &lt;filter-mapping&gt;元素中有一个特殊的子元素&lt;dispatcher&gt;,该元素用于指定过滤器所拦截的资源被Servlet容器调用的方式,&lt;dispatcher&gt;元素的值共有4个,具体如下: 1)REQUEST 当用户直接访问页面时,Web容器将会...

    Servlet查询数据库案例--Query(java源码)

    out.println("&lt;head&gt;&lt;title&gt;DB Query&lt;/title&gt;&lt;/head&gt;\n" + "&lt;body bgcolor=white&gt;&lt;h1&gt;DB Query&lt;/h1&gt;\n" + "&lt;form&gt;&lt;b&gt;Query: &lt;/b&gt;&lt;input name='q'&gt;" + "&lt;input type=submit&gt;&lt;/form&gt;"); // See if a ...

    jfinalpluginsjfinal-dreampie.zip

     &lt;li&gt;&lt;a href="/admin/user"&gt;${i18n.getText("admin.user")}&lt;/a&gt;&lt;/li&gt;  &lt;/@shiro.hasPermission&gt; 14.xss过滤的StringEscapeUtils过滤器实现 public class AttackHandler extends Handler {  @Override ...

    multi-view-resolver:示范项目:spring mvc整合jsp和thymeleaf两个模板引擎

    spring mvc整合jsp和... &lt; dependency&gt; &lt; groupId&gt;org.thymeleaf&lt;/ groupId&gt; &lt; artifactId&gt;thymeleaf&lt;/ artifactId&gt; &lt; version&gt;3.0.6.RELEASE&lt;/ version&gt; &lt;/ dependency&gt; &lt;!-- https://mvnrepository.com/artifac

Global site tag (gtag.js) - Google Analytics