我在应用程序中使用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中的一个bug还是一个故意的行为。
在我的代码中,我在mousePressEvent()方法中计算关闭QMenu时鼠标单击的坐标,该方法已在继承QMenu的自定义菜单类中重写。但由于上面强调的原因,它正在破坏Mac OS上的整个应用程序。
我使用的是Qt版本5.12.3

最佳答案

这很可能是由于在macOs上,菜单是由操作系统处理的。
这是由QMenu::toNSMenu()函数暗示的。
对您来说,NSMenu似乎不提供获取鼠标单击坐标的方法。
如果我可以建议你改变你的实现,不要依赖任何平台上的MousePressEvent。QMenus可以使用键盘进行交互,在这种情况下,您将没有mousepresessevent,并且您将遇到相同的问题。

关于linux - 关闭QMenu后,Mac OS和Linux上发出的QEvent类型不同,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56940933/

10-10 09:58