Qt事件传递相关问题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012790503/article/details/84572591

事件传递

涉及到深层次窗口结构或者窗口封装时,经常会遇到上层窗口接收不到事件的问题。排除这类问题需要了解窗口间的事件传递过程。

应用程序产生事件时,事件会先派发给父窗口,由父窗口在内部派发给子窗口,子窗口会进一步传递给子窗口的子窗口,直到遍历到最后没有子窗口的窗口对象,进入子窗口的用户事件处理函数。从子窗口开始,事件会依次进入到父窗口的事件处理函数中,子窗口可以调用event->accept()来中断事件的向上传递。总结来说是先下沉再上浮。

当发现父窗口没有对应的事件触发用户函数时,首先要确认相关功能是否启用,比如鼠标悬停和拖拽功能。其次需要在子窗口的事件处理函数中,显式调用event->ignore()来使事件继续向上传递。

关于鼠标悬停移动和拖拽事件

具有父子关系的窗口,如果想父窗口接收到上述事件,必须将父窗口和所有的子窗口的相关功能全部启用,否则事件会在中间某个窗口中断传递。

QGraphicsView中的事件

默认view不会将鼠标移动事件传递出来,所以需要显式的在view中重载mouseEvent(),并将事件ignore(),将其传递出来,这样做是为了将事件全部通知所有父子窗口。

QGraphicsScene中的事件

悬停事件在图元重叠时,事件会被上层图元(无父子关系)拦截,但是一般地图应用需求可能需要通知所有下层图元。此问题的解决办法见另一篇文章:解决Qt graphis-view框架中,上层图元接收hover事件导致底层图元接收不到的问题

猜你喜欢

转载自blog.csdn.net/u012790503/article/details/84572591