我是靠谱客的博主 洁净斑马,最近开发中收集的这篇文章主要介绍Qt事件分发,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

最近在想Qt事件产生后,放入到系统的事件队列中,等待事件分发器向外分发,

但是Qt是如何得知该事件要分发给谁呢?

下面是网友的一些回答:

一个事件发生之后,Qt怎么知道该发给哪个QObject的event()函数呢?

我看了一下文档里关于QApplication::sendEvent()函数的说明,

一个sendEvent()函数只能连接一对event-receiver。

所以Qt是会自动把事件发送给所有的QObject(包括自定义的)吗?


个人认为会进行广播,也就是发送给所有 QObject,

只不过有的对象会进行处理,有的对象直接忽略。

至于 sendEvent() 函数,你当然可以通过两次调用来发送给两个对象的


thx,感谢豆子君的回复~btw,

说得更细点可能是QCoreApplication类先发送给每个Object树的顶层?

(因为子组件ignore后会自动发送给父组件)



感觉应该是可以这样理解的


keypress event应该是发给当前焦点的object,

如果不处理为false,再由object向父object传递,处理就为true 停止传递。


因为Qt所有的对象都继承自QObject,那么是不是在这个QObject中关联了事件需要发到哪个消息队列上呢?

还是定义成全局的或者是静态的啦?一个进程有一个系统消息队列。

对象在创建的时候,是不是都被添加了一个树状的结构中,

这样分发消息的时候,Dispatcher从这个树的顶部开始依次向下调用每个QObject对象的event()函数。

先向父亲为0的对象进行分发,对象在收发后,同时分发给他的孩子,(即依次调用所有孩子的event()函数)。

因为GUI是单进程单线程的,所以这样的遍历调用是同步阻塞式的,只要其中有一个返回true,

则表示该事件被处理了,Dispatcher就无需再分发了,可以直接从消息队列中删除了。

以后只是俺个人的理解,因为没有做过GUI这种宏大的事件编程机制,很多东东需要猜测的。





最后

以上就是洁净斑马为你收集整理的Qt事件分发的全部内容,希望文章能够帮你解决Qt事件分发所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(63)

评论列表共有 0 条评论

立即
投稿
返回
顶部