views:

693

answers:

1

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?

+5  A: 

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);
  ...
}
baysmith
Thanks, that works for getting continuous updates when the mouse is over the application window, but if the mouse moves elsewhere, the position doesn't update.
Switch
To track the mouse outside the window, you'd need to grab the mouse (see QWidget::grabMouse()). Since all mouse events will be sent to the widget which has grabbed the mouse, this will prevent normal interaction with other widgets, unless you only grab the mouse only when the mouse leaves the window (in the leaveEvent()) and then release the mouse on enterEvent().
baysmith
After adding grabMouse(), it still only updates when the mouse passes over the application window
Switch
Using grabMouse() works for me, but it does have negative consequences for trying to interact with multiple windows.Another alternative would be to use a QTimer to continuously poll the mouse position which can be retrieved with QCursor::pos().
baysmith

related questions