概述
最近在想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事件分发所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复