Obtenir MouseMoveEvents en Qt

dans mon programme, j'aimerais que mouseMoveEvent(qmouseevent* event) soit appelé chaque fois que la souris bouge (même si c'est au-dessus d'une autre fenêtre).

<!-Maintenant, dans mon mainwindow.fichier cpp, j'ai:

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

mais cela semble être seulement appelé quand je clique et traîne la souris tandis que 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 pas faire quelque chose de différent (mouseMoveEvent est toujours seulement appelé quand je tiens un bouton de souris vers le bas, indépendamment de l'endroit où il est). Quelle est la façon la plus simple de suivre la position de la souris à l'échelle mondiale?

31
demandé sur Switch 2009-12-20 09:16:49

2 réponses

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

définir et implémenter le MainWindow de bool:: 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énement lorsque les fenêtres principales sont construites (ou ailleurs). Par exemple,

MainWindow::MainWindow(...)
{
  ...
  qApp->installEventFilter(this);
  ...
}
34
répondu baysmith 2009-12-20 07:23:21

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

Vous pouvez éviter d'avoir à créer le filtre d'événement en appelant setMouseTracking(true) comme @Kyberias l'a noté. Cependant, cela doit être fait sur le vieport, pas de votre fenêtre principale elle-même. (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 son installation.

2
répondu pelesl 2015-06-21 00:01:01