`
美丽的小岛
  • 浏览: 310686 次
  • 性别: 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
分享到:
评论

相关推荐

    springMVC+mybitis+mongodb+maven整合

    &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-value&gt;/...

    springmvc+spring+mybatis集成框架的环境搭建

    &lt;artifactId&gt;hibernate-commons-annotations&lt;/artifactId&gt; &lt;version&gt;4.0.4.Final&lt;/version&gt; &lt;/dependency&gt; ``` #### 四、Spring 依赖配置 由于提供的 `pom.xml` 内容被截断,这里补充完整的 Spring 依赖配置...

    JSP页面设计表格

    行(`&lt;tr&gt;`)定义了表格的每一行,而单元格(`&lt;td&gt;`或`&lt;th&gt;`)则定义了表格中的数据或表头。例如: ```html &lt;table&gt; &lt;tr&gt; &lt;th&gt;姓名&lt;/th&gt; &lt;th&gt;年龄&lt;/th&gt; &lt;th&gt;城市&lt;/th&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;张三&lt;/td&gt; &lt;td&gt;25&lt;/td&gt; ...

    用idea 创建maven项目,整合ssm框架

    &lt;groupId&gt;org.springframework&lt;/groupId&gt; &lt;artifactId&gt;spring-context&lt;/artifactId&gt; &lt;version&gt;5.3.23&lt;/version&gt; &lt;/dependency&gt; &lt;dependency&gt; &lt;groupId&gt;org.springframework&lt;/groupId&gt; &lt;artifactId&gt;spring-web...

    使用Maven搭建S2SH工程详解一:使用Maven创建struts2工程

    &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; &lt;/...

    Spring MVC 配置 urlrewrite 实例

    &lt;dispatcher&gt;REQUEST&lt;/dispatcher&gt; &lt;dispatcher&gt;FORWARD&lt;/dispatcher&gt; &lt;/filter-mapping&gt; ``` 这样,每当有HTTP请求到达时,`UrlRewriteFilter`都会先进行处理。 3. **配置urlrewrite.xml** `...

    java8+tomcat8+struts2.5+spring4.3+hibernate5.2框架搭建详细过程

    &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; &lt;/...

    <Reslet1>:Reslet+Spring,配置简单web访问

    &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-value&gt;/...

    maven搭建SSM框架

    &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-value&gt;/...

    maven配置ssm框架

    &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-value&gt;/...

    使用Maven构建Spring MVC项目的简单示例

    &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-value&gt;/...

    java后台开发例子–使用Maven建立springmvc的web项目

    &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-value&gt;/...

    ssm框架搭建.pdf

    &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-value&gt;/...

    SSM三大框架的整合(技术学习).docx

    &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-value&gt;/...

    urlRewrite

    &lt;dispatcher&gt;INCLUDE&lt;/dispatcher&gt; &lt;/filter-mapping&gt; ``` 这里的`confReloadCheckInterval`参数设置为60秒,表示每60秒检查一次`urlrewrite.xml`文件是否有更新,如果有更新,则自动加载新的配置。 ##### 3. 创建...

    SpringMVC整合Freemarker例子

    Map&lt;String, Object&gt; model = new HashMap&lt;&gt;(); model.put("message", "Hello, SpringMVC + Freemarker!"); return new ModelAndView("hello", model); } } ``` 在上述示例中,"hello"是视图名称,对应的...

    dispatcher 源码详解

    &lt;servlet-name&gt;chapter2&lt;/servlet-name&gt; &lt;servlet-class&gt;org.springframework.web.servlet.DispatcherServlet&lt;/servlet-class&gt; &lt;load-on-startup&gt;1&lt;/load-on-startup&gt; &lt;/servlet&gt; &lt;servlet-mapping&gt; &lt;servlet-...

    实验考试一.doc

    &lt;filter-class&gt;org.apache.struts2.dispatcher.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; &lt;/...

    maven构建的springmvc入门源代码

    &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-value&gt;/...

Global site tag (gtag.js) - Google Analytics