如果 QMenu 弹出,如何使小部件在光标位于其上时接收 QMouseEvent?
Posted
技术标签:
【中文标题】如果 QMenu 弹出,如何使小部件在光标位于其上时接收 QMouseEvent?【英文标题】:How to make widgets receive QMouseEvent when cursor is upon it if QMenu pops up? 【发布时间】:2016-09-22 03:21:20 【问题描述】:当QMenu的实例如下弹出时,只有menu可以接收mouseMoveEvent。
def contextMenuEvent(self, event):
'''
some code
'''
menu.exec_(event.globalPos())
但我希望其他小部件的行为就像菜单不存在时一样。这意味着如果光标在其上,小部件可以接收 mouseMoveEvent。
我知道我的目的可以实现,因为有些应用已经实现了。但是我不知道Qt中的正确方法。
感谢您的帮助。
【问题讨论】:
【参考方案1】:一种方法应该是在 QMenu 上安装一个 QEventHandler 来接收所有 事件到达菜单之前。然后,您可以检查事件类型并将其在鼠标事件的情况下直接发送到小部件。
您可能对鼠标坐标有疑问,但总有一些方法(如全局 x 和 y)映射到正确的小部件相对坐标。
简单示例(c++ 但 python 或多或少相同):
void MyClass::init()
m_menu->installEventFilter(this);
bool MyClass::eventFilter(QObject * obj, QEvent * event)
// filter the events you are interested in ...
if (event->type() == QEvent::MouseButtonPress)
// at this point you may need to alter the coordinates, not sure, just try
// send the event to your mouseEventHandling method
this->mousePressEvent(event);
else
// this will stop any further handling of this event (the menu itself will not receive it)
// change to false if the menu shall work as usual
return true;
// this will trigger regular event handling for all other events
return QObject::eventFilter(obj, event);
另见http://doc.qt.io/qt-5/qobject.html#installEventFilter
要自行处理所有事件并根据需要分发,请考虑使用透明小部件覆盖您可以过滤其事件的所有内容。 (您可以将多个小部件放在同一个网格布局单元格中)。
【讨论】:
感谢您的帮助。 Aaron Hillegass 是我第一位阅读 CS 书籍的英语老师。 Aaron 很高兴见到你他们。 我试试看。是否有任何链接说明如何操作?以上是关于如果 QMenu 弹出,如何使小部件在光标位于其上时接收 QMouseEvent?的主要内容,如果未能解决你的问题,请参考以下文章