Qt中的事件大致可分为3类:
Spontaneous events |
从系统得到的消息:鼠标按键、键盘按键、定时器事件等。转化为QEvent后被Qt事件系统依次处理 |
Posted events |
由Qt或应用程序直接生成,放入Qt消息队列 |
Sent events |
由Qt或应用程序产生,不放入队列直接被派发和处理 |
本文中,先简单看一下后两种,然后重点看看第一种。
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模块。就是和窗口系统(重绘、移动等等事件)以及键鼠事件有关了。
参考
相关推荐
<br><br>此值大于0.5时,参数需加大 <br><br>select sum(wait)/sum(totalq) "dispatcher waits" from v$queue where type='dispatcher'; <br>select count(*) from v$dispatcher; <br>select servers_highwater ...
<servlet-name>dispatcher</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-...
#Blitz Blitz 是一个开源的基于Servlet 规范和Spring规范的Restful响应框架。通过配置Filter Bean 的方式介入处理请求。 ... <dispatcher>REQUEST</dispatcher> <dispatcher>FORWARD</dispatch
<servlet-class>org.jboss.resteasy.plugins.server.servlet.HttpServlet30Dispatcher</servlet-class> </servlet> <servlet-mapping> <servlet-name>Resteasy</servlet-name> <url-pattern>/app/service/*...
<filter-class>org.apache.struts2.dispatcher.ActionContextCleanUp</filter-class> filter> <filter> <filter-name>sitemesh</filter-name> <filter-class>...
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>GBK</param-value> </init-param> <init-param...
<filter-name>struts2</filter-name> <filter-class> org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter </filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-...
<result name="success" type="dispatcher">/org/index.jsp</result> <result name="select">/org/select.jsp</result> </action> <action name="add_input" class="orgAction" method="add"> ...
<servlet-name>Dispatcher</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!--servlet的参数配置,查找controller位置的xml文件配置,此参数指定了...
Dispatcher < string> = new signals . Dispatcher < string> ( ) ;var receiver = ( msg : string ) => { console . log ( "message received!" , msg ) ;}messenger . listen ( receiver ) ;messenger . d
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> ...
<servlet>dispatcher</servlet> <!-- 配置核心控制器 --> <servlet>cn.northpark.jeyy.servlet.JeyyServlet</servlet> <init> <param>template</param> <!-- 配置选择的模板引擎,可以Jsp
javaweb项目 DispatcherServle源码详解 web.xml 配置
通过Akka进行异步执行和集群支持投影,CommandHandlers和Sagas的注释驱动配置持久性事件和网络事件的Json或二进制(Kryo)序列化Maven依赖 <dependency> <groupId>no.ks</groupId> <artifactId>eventstore2</...
<filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class> <!-- 引用个具体类文件 --> </filter> <filter-mapping> <filter-name>struts2</filter-name> ...
例如:login,在此页面<body></body>之间输入 <form action="login.action" method="post"> username: <input type="text" name="username"> <br> password: <input type="password" name="password...
<filter-mapping>元素中有一个特殊的子元素<dispatcher>,该元素用于指定过滤器所拦截的资源被Servlet容器调用的方式,<dispatcher>元素的值共有4个,具体如下: 1)REQUEST 当用户直接访问页面时,Web容器将会...
out.println("<head><title>DB Query</title></head>\n" + "<body bgcolor=white><h1>DB Query</h1>\n" + "<form><b>Query: </b><input name='q'>" + "<input type=submit></form>"); // See if a ...
<li><a href="/admin/user">${i18n.getText("admin.user")}</a></li> </@shiro.hasPermission> 14.xss过滤的StringEscapeUtils过滤器实现 public class AttackHandler extends Handler { @Override ...
spring mvc整合jsp和... < dependency> < groupId>org.thymeleaf</ groupId> < artifactId>thymeleaf</ artifactId> < version>3.0.6.RELEASE</ version> </ dependency> <!-- https://mvnrepository.com/artifac