Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Getting MouseMoveEvents in Qt

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?

like image 345
Switch Avatar asked Dec 20 '09 06:12

Switch


2 Answers

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);   ... } 
like image 140
baysmith Avatar answered Nov 10 '22 16:11

baysmith


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.

like image 43
darda Avatar answered Nov 10 '22 15:11

darda