首页 > 解决方案 > 关闭 QMenu 时在 Mac OS 和 Linux 上发出的 QEvent 类型的差异

问题描述

我在我的应用程序中使用 QMenu,当我在 QMenu 外部单击以关闭它时,Qt 会发出几个事件。我发现在 Linux 上,它会发出以下事件:

QEvent::MouseButtonPress
QEvent::Close
QEvent::Hide
QEvent::HideToParent
QEvent::UpdateRequest
QEvent::Leave

在 Mac OS 上,发出的事件如下:

QEvent::Close
QEvent::Hide
QEvent::HideToParent
QEvent::UpdateRequest
QEvent::Leave

可以看出,当 QMenu 关闭时,QEvent::MouseButtonPress 不会在 Mac 环境中发出。我想知道这是 Qt 中的错误还是故意行为。

在我的代码中,我正在计算关闭 QMenu 时鼠标单击的坐标,在 mousePressEvent() 方法中,我在继承 QMenu 的自定义菜单类中覆盖了该方法。但由于上面强调的原因,它正在破坏 Mac OS 上的整个应用程序。

我正在使用Qt 版本 5.12.3

标签: linuxmacosqtqmenuqevent

解决方案


这可能是由于在 macOS 上,菜单由操作系统处理。

函数暗示了这一点QMenu::toNSMenu()。您NSMenu似乎不太可能提供一种获取鼠标单击坐标的方法。

如果我建议您更改您的实现,而不是依赖于任何平台上的 MousePressEvent。QMenus可以使用键盘进行交互,在这种情况下,您将没有 MousePressEvent 并且您将遇到同样的问题。


推荐阅读