概述
事件传递
涉及到深层次窗口结构或者窗口封装时,经常会遇到上层窗口接收不到事件的问题。排除这类问题需要了解窗口间的事件传递过程。
应用程序产生事件时,事件会先派发给父窗口,由父窗口在内部派发给子窗口,子窗口会进一步传递给子窗口的子窗口,直到遍历到最后没有子窗口的窗口对象,进入子窗口的用户事件处理函数。从子窗口开始,事件会依次进入到父窗口的事件处理函数中,子窗口可以调用event->accept()来中断事件的向上传递。总结来说是先下沉再上浮。
当发现父窗口没有对应的事件触发用户函数时,首先要确认相关功能是否启用,比如鼠标悬停和拖拽功能。其次需要在子窗口的事件处理函数中,显式调用event->ignore()来使事件继续向上传递。
关于鼠标悬停移动和拖拽事件
具有父子关系的窗口,如果想父窗口接收到上述事件,必须将父窗口和所有的子窗口的相关功能全部启用,否则事件会在中间某个窗口中断传递。
QGraphicsView中的事件
默认view不会将鼠标移动事件传递出来,所以需要显式的在view中重载mouseEvent(),并将事件ignore(),将其传递出来,这样做是为了将事件全部通知所有父子窗口。
QGraphicsScene中的事件
悬停事件在图元重叠时,事件会被上层图元(无父子关系)拦截,但是一般地图应用需求可能需要通知所有下层图元。此问题的解决办法见另一篇文章:解决Qt graphis-view框架中,上层图元接收hover事件导致底层图元接收不到的问题
最后
以上就是标致口红为你收集整理的Qt事件传递相关问题的全部内容,希望文章能够帮你解决Qt事件传递相关问题所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复