Qt-右键单击mouseReleaseEvents不会被eventfilter捕获,但会捕获其他事件

时间:2010-10-13 16:29:14

标签: qt button mouse

我的应用程序包含一个WebView小部件。鼠标单击窗口小部件不是由我的应用程序的mousePressEvent()处理,而是由WebView窗口小部件处理。所以,我安装了一个事件过滤器来接收事件。现在,我收到所有事件的通知,除了右键单击的mouseReleaseEvent(对于左键单击,一切正常,右键单击的mousePressEvent也正在注册)。我想这与通过右键单击生成的上下文事件有关(生成弹出菜单)。但由于我使用过滤器,应首先将事件发送给我。以下是事件过滤器的代码 在占碑,但我希望我可以修改Qt给Jambi的答案。

public boolean eventFilter(QObject o,QEvent event)
 {
  if (event.type()==QEvent.Type.MouseButtonPress)   // One can call the mousePressEvent() functions from here,which can do this work but speed
  {
   if (((QMouseEvent)event).button()==Qt.MouseButton.LeftButton)
   {
    mousebuttontype=1;
    clickedorpressed=1;
   }
   else
   if (((QMouseEvent)event).button()==Qt.MouseButton.RightButton)
   {
    mousebuttontype=2;
    System.out.println("right");
   }
   t1=QTime.currentTime();
   t1.start();
  }
  else
  if (event.type()==QEvent.Type.MouseButtonRelease)
  {
   if (t1.elapsed()>900)
   {
    switch(mousebuttontype)
    {
     case 1: browser.back();
      break;
     case 2: browser.forward();
      break;
    } 
   }System.out.println("choda");
  } 

  return false;
 }

我的基本目标是获得正确点击的正确时间间隔。有什么办法吗?

4 个答案:

答案 0 :(得分:3)

一些挖掘当然似乎暗示如果这是特定系统上下文菜单的触发器,则可能没有生成右鼠标释放事件。这些传达为QContextMenuEvent

此Qt实验室发布hints about this too

如果系统依赖,解决方法可能会很棘手。您是否尝试在QApplication类中覆盖event()以查看事件是否来自那里?有些事件不一定会传给孩子,但一切都要经过QApplication :: event()。

答案 1 :(得分:1)

另一个选择是,子类Qwebview并覆盖mouseReleaseEvent事件

答案 2 :(得分:0)

我找到了一个解决方案,我认为这不会取决于系统。

我的特殊情况是使用mouseReleaseEvent来捕获事件,并自己使用它们。我没有得到这些事件。

在我想要处理事件的窗口小部件的所有子窗口小部件上,我添加了类定义:

protected:
    void mouseReleaseEvent(QMouseEvent *event) {event->ignore();}

这将覆盖上下文菜单的默认实现,并将mouseReleaseEvent作为其他鼠标按钮发送回父链。

http://doc.qt.io/qt-5/qevent.html#ignore

这表明它可能会传播到父窗口小部件。如链接所示,这在Qt 5.9中为我修复了,但我认为它几乎适用于所有版本。

(我知道这个问题确实是7年了,但它不包含我认为最好的解决方案,并且在谷歌上显示为结果2(qt没有在rightclick上获得鼠标释放事件)所以我认为它应该得到最新答案。)

答案 3 :(得分:0)

如果不进行更广泛的实现说明,我需要解决的与此问题相关的核心问题是我需要知道上下文菜单是否吞下了右键单击以便我可以确保正确处理某些自定义状态。我能找到的最简单的解决方法是实现contextMenuEvent,它在mousePressEvent之后被调用,以检测事件是否被接受(在我的QGraphicsScene / Items中的某个地方打开了一个上下文菜单)。以下是Python中用于演示如何使用事件状态的最小示例:

def contextMenuEvent(self, event):
    event.setAccepted(False)
    super(MyGraphicsView, self).contextMenuEvent(event)        
    self.__context_menu_used = event.isAccepted()

注意,您也可以完全跳过运行基类contextMenuEvent以阻止场景/项打开上下文菜单。如果您想要进行类似3D-DCC的alt-RMB缩放而不会意外打开上下文菜单,这很方便,例如:

def contextMenuEvent(self, event):
    # Block context menus if alt is held down
    if event.modifiers() & QtCore.Qt.AltModifier:
        return

    event.setAccepted(False)
    super(MyGraphicsView, self).contextMenuEvent(event)        
    self.__context_menu_used = event.isAccepted()