Getting MouseMoveEvents in Qt

65,464

Solution 1

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);
  ...
}

Solution 2

I had the same problem, further exacerbated by the fact that I was trying to call this->update() to repaint the window on a mouse move and nothing would happen.

You can avoid having to create the event filter by calling setMouseTracking(true) as @Kyberias noted. However, this must be done on the viewport, not your main window itself. (Same goes for update).

So in your constructor you can add a line this->viewport()->setMouseTracking(true) and then override mouseMoveEvent rather than creating this filter and installing it.

Share:
65,464
Switch
Author by

Switch

Updated on May 27, 2020

Comments

  • Switch
    Switch almost 4 years

    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?