我有一个自QTabWidget
子类化的自定义窗口小部件,该窗口小部件已实现为接受QDropEvents
用于文件。将文件放到TabWidget
上后,将打开它们进行编辑。这部分工作正常。但是,我想在编辑器中实现拖放功能(就像LabView风格的GUI)。我已经在acceptsDrops
上正确实现了事件处理程序和EditorWidget
,但是TabWidget
接收了所有事件,并尝试将它们作为文件处理。我可以通过mimedata将与文件相关的事件与编辑器的事件区分开来,但我不知道如何将事件从TabWidget
传递到适当的EditorWidget
。
如何将QDropEvent从从系统接收到它的窗口小部件传递给它拥有的另一个窗口小部件?另外,如何根据事件的内容告诉系统哪个小部件应该接收事件?
由于受保护,因此无法调用子级的dropEvent
方法。我可以创建一系列自己的方法来传递事件,但这似乎是多余且脆弱的。我已经考虑安装EventFilter,但是据我所知,它只会丢弃事件,不会说“不是我尝试其他人”。
提前感谢您的帮助!
答案 0 :(得分:1)
有趣!我认为在父窗口小部件中接受事件,然后尝试将其转发给子窗口小部件,在架构上不是正确的方法。基本上会违反封装(对象处理自己的事件)。
如果我是您,我将调查为什么子小部件没有首先看到该事件。子窗口小部件位于其父母之上,因此您的子窗口小部件应首先参加该活动。您打过setAcceptDrops(true)
吗?
解决此问题后,可以在子窗口小部件事件处理程序中分析事件,如果事件应该转发到父QTabWidget,则调用event->ignore()
。如果您不拨打电话ignore()
,则子级将“消费”该事件,并且该事件将不会传播给父级!
这是一篇有关事件传播的旧博客文章,可以帮助您:
答案 1 :(得分:1)
解决我自己的问题:
正如普林尼(Pliny)所说,孩子应该首先看到这个事件。我的问题似乎是在EditorWidget
中我没有实现dragEnterEvent
和dragMoveEvent
,所以即使我在dropEvent
中实现了EditorWidget
{{1} }控制了阻力,因此偷走了下落。