事件过滤器未捕获 Qt 鼠标移动事件

Posted

技术标签:

【中文标题】事件过滤器未捕获 Qt 鼠标移动事件【英文标题】:Qt mouse move events not caught by an event filter 【发布时间】:2011-06-22 12:18:54 【问题描述】:

我似乎无法在我的 eventFilter 中捕获 QEvent::MouseMove 类型的事件。

这是我的事件过滤器:

bool
MapWidget_c::eventFilter( QObject *obj, QEvent *ev )

   if( obj == graphicsGeoMap_mp ||
       obj == graphicsScene_mp ||
       obj == graphicsView_mp )
   
      if( ev->type() == QEvent::MouseMove )
      
         QMouseEvent *mouseEvent = static_cast< QMouseEvent* >( ev );

         mouseMoveEvent( mouseEvent );

         return true;
      
      else
      
         return false;
      
   
   else
   
      // pass the event on to the parent class
      return QWidget::eventFilter( obj, ev );
   

我这样安装过滤器:

graphicsGeoMap_mp->installEventFilter( this ); //QGraphicsGeoMap
graphicsScene_mp->installEventFilter( this ); //QGraphicsScene
graphicsView_mp->installEventFilter( this ); //QGraphicsScene

事件过滤器似乎可以很好地捕获 mousePress 和 mouseRelease 事件,但不能捕获 mouseMove。

可能是什么问题?

【问题讨论】:

【参考方案1】:

原来我在寻找错误的 mouseMove 事件。

我应该一直在捕捉 QEvent::GraphicsSceneMouseMove 事件而不是 QEvent::MouseMove 事件。

【讨论】:

【参考方案2】:

鼠标移动事件通常不启用。您需要在您的 wigdet(s) 上启用鼠标跟踪(通过 setMouseTracking)才能获取它们。

来自QMouseEvent:

只有在按下鼠标按钮时才会发生鼠标移动事件,除非使用 QWidget::setMouseTracking() 启用了鼠标跟踪。

【讨论】:

以上是关于事件过滤器未捕获 Qt 鼠标移动事件的主要内容,如果未能解决你的问题,请参考以下文章

[Qt]自定义表头实现过滤功能

Qt4:未捕获 QTableView 鼠标按钮事件

Qt:让父母决定孩子是不是接受事件

QT 中QComboBox控件鼠标事件过滤

QT 中QComboBox控件鼠标事件过滤

Qt3d用c ++输入