Qt MouseMove事件没有被eventFilter()捕获

时间:2015-02-26 15:35:33

标签: c++ qt

根本不起作用。 我已启用鼠标跟踪,然后安装了事件过滤器,一切正常,但MouseMove事件除外。 请帮忙吗?

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    setMouseTracking(true);
    installEventFilter(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

bool MainWindow::eventFilter(QObject *object, QEvent *event)
{
    if(event->type() == QEvent::MouseMove)
    {
        QMouseEvent *mEvent = (QMouseEvent*)event;
        qDebug() << mEvent->pos();
    }
    return false;
}

3 个答案:

答案 0 :(得分:4)

这一行很奇怪,你要求this过滤自己

installEventFilter(this);

如果Qt完全忽略自我过滤事件,我会感到惊讶

尝试使用此方法检测中央窗口小部件中的鼠标移动事件:

centralWidget()->installEventFilter(this);
centralWidget()->setMouseTracking(true);

或者,为了检测MainWidget中的鼠标移动事件,请在setMouseTracking(true)上使用this,而不是添加事件过滤器,重新实现mouseMoveEvent()受保护的功能:

//In constructor:
setMouseTracking(true);

void MainWindow::mouseMoveEvent(QMouseEvent * event)
{
    //do stuff here

    event->reject(); //To avoid messing QMainWindow mouse behavior
}

答案 1 :(得分:2)

这是QT的另一个设计问题:eventFilter不会收到事件......除非你覆盖mouseMoveEvent并忽略那里的信号。

void mouseMoveEvent(QMouseEvent* e) override { e->ignore(); }

现在,可以使用eventFilter ......这通常是可取的,因为您可能有一些要与多个小部件一起使用的eventFilter类。

答案 2 :(得分:1)

QMainWindow的centralWidget位于MainWindow区域。 尝试将此代码添加到MainWindow构造函数

ui->centralWidget->setMouseTracking(true);

鼠标事件将首先出现在MainWindow上,然后发送到centralWidget。