如何将QEvents传递给子窗口小部件?

时间:2018-07-18 17:32:01

标签: c++ qt events

这里是情况:

我有一个自QTabWidget子类化的自定义窗口小部件,该窗口小部件已实现为接受QDropEvents用于文件。将文件放到TabWidget上后,将打开它们进行编辑。这部分工作正常。但是,我想在编辑器中实现拖放功能(就像LabView风格的GUI)。我已经在acceptsDrops上正确实现了事件处理程序和EditorWidget,但是TabWidget接收了所有事件,并尝试将它们作为文件处理。我可以通过mimedata将与文件相关的事件与编辑器的事件区分开来,但我不知道如何将事件从TabWidget传递到适当的EditorWidget

问题是

如何将QDropEvent从从系统接收到它的窗口小部件传递给它拥有的另一个窗口小部件?另外,如何根据事件的内容告诉系统哪个小部件应该接收事件?

我尝试过的事情:

由于受保护,因此无法调用子级的dropEvent方法。我可以创建一系列自己的方法来传递事件,但这似乎是多余且脆弱的。我已经考虑安装EventFilter,但是据我所知,它只会丢弃事件,不会说“不是我尝试其他人”。

提前感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

有趣!我认为在父窗口小部件中接受事件,然后尝试将其转发给子窗口小部件,在架构上不是正确的方法。基本上会违反封装(对象处理自己的事件)。

如果我是您,我将调查为什么子小部件没有首先看到该事件。子窗口小部件位于其父母之上,因此您的子窗口小部件应首先参加该活动。您打过setAcceptDrops(true)吗?

解决此问题后,可以在子窗口小部件事件处理程序中分析事件,如果事件应该转发到父QTabWidget,则调用event->ignore()。如果您不拨打电话ignore(),则子级将“消费”该事件,并且该事件将不会传播给父级!

这是一篇有关事件传播的旧博客文章,可以帮助您:

http://blog.qt.io/blog/2006/05/27/mouse-event-propagation/

答案 1 :(得分:1)

解决我自己的问题: 正如普林尼(Pliny)所说,孩子应该首先看到这个事件。我的问题似乎是在EditorWidget中我没有实现dragEnterEventdragMoveEvent,所以即使我在dropEvent中实现了EditorWidget {{1} }控制了阻力,因此偷走了下落。