web-dev-qa-db-fra.com

Obtenir MouseMoveEvents dans Qt

Dans mon programme, j'aimerais avoir mouseMoveEvent (événement QMouseEvent *) appelé chaque fois que la souris se déplace (même lorsqu'elle se trouve sur une autre fenêtre).

En ce moment, dans mon fichier mainwindow.cpp, j'ai:

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

Mais cela ne semble être appelé que lorsque je clique et que je fais glisser la souris sur la fenêtre du programme lui-même. J'ai essayé d'appeler

setMouseTracking(true);

dans le constructeur de MainWindow, mais cela ne semble rien faire différemment (mouseMoveEvent n'est toujours appelé que lorsque je maintiens le bouton de la souris enfoncé, peu importe où il se trouve). Quelle est la façon la plus simple de suivre la position de la souris dans le monde?

31
Switch

Vous pouvez utiliser un filtre d'événements sur l'application.

Définissez et implémentez bool MainWindow :: eventFilter (QObject *, QEvent *). Par exemple

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

Installez le filtre d'événements lors de la construction de MainWindows (ou ailleurs). Par exemple

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

J'ai eu le même problème, encore exacerbé par le fait que j'essayais d'appeler this->update() pour repeindre la fenêtre d'un coup de souris et rien ne se passerait.

Vous pouvez éviter d'avoir à créer le filtre d'événements en appelant setMouseTracking(true) comme l'a noté @Kyberias. Cependant, cela doit être fait sur le vieport, pas sur votre fenêtre principale elle-même. (Il en va de même pour la mise à jour).

Ainsi, dans votre constructeur, vous pouvez ajouter une ligne this->viewport()->setMouseTracking(true) puis remplacer mouseMoveEvent plutôt que de créer ce filtre et de l'installer.

3
darda