如果 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?的主要内容,如果未能解决你的问题,请参考以下文章

如何使小部件的高度最多为 X 像素?

Kivy:如何使小部件表现得像溢出:隐藏

如何使小部件在颤动中相互浮动[关闭]

如何在kivy的gridlayout中使小部件跨越多个列/行

如何使小部件填充列中的剩余空间

如何使小部件随 PyQt5 中的窗口缩放?