Getting MouseMoveEvents in Qt

Switch picture Switch · Dec 20, 2009 · Viewed 61.2k times · Source

In my program, I'd like to have mouseMoveEvent(QMouseEvent* event) called whenever the mouse moves (even when it's over another window).

Right now, in my mainwindow.cpp file, I have:

void MainWindow::mouseMoveEvent(QMouseEvent* event) {
    qDebug() << QString::number(event->pos().x());
    qDebug() << QString::number(event->pos().y());
}

But this seems to only be called when I click and drag the mouse while over the window of the program itself. I've tried calling

setMouseTracking(true);

in MainWindow's constructor, but this doesn't seem to do anything differently (mouseMoveEvent still is only called when I hold a mouse button down, regardless of where it is). What's the easiest way to track the mouse position globally?

Answer

baysmith picture baysmith · Dec 20, 2009

You can use an event filter on the application.

Define and implement bool MainWindow::eventFilter(QObject*, QEvent*). For example

bool MainWindow::eventFilter(QObject *obj, QEvent *event)
{
  if (event->type() == QEvent::MouseMove)
  {
    QMouseEvent *mouseEvent = static_cast<QMouseEvent*>(event);
    statusBar()->showMessage(QString("Mouse move (%1,%2)").arg(mouseEvent->pos().x()).arg(mouseEvent->pos().y()));
  }
  return false;
}

Install the event filter when the MainWindows is constructed (or somewhere else). For example

MainWindow::MainWindow(...)
{
  ...
  qApp->installEventFilter(this);
  ...
}