2009-12-20 5 views
29

Dans mon programme, je voudrais avoir mouseMoveEvent (* QMouseEvent événement) appelé à chaque fois que la souris se déplace (même quand il est sur une autre fenêtre).Obtenir MouseMoveEvents dans Qt

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

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

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

setMouseTracking(true); 

dans le constructeur de MainWindow, mais cela ne semble pas faire quoi que ce soit différemment (mouseMoveEvent est encore appelée que lorsque je détiens un bouton de la souris vers le bas, quel que soit l'endroit où il est). Quel est le moyen le plus simple de suivre la position de la souris dans le monde?

Répondre

32

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

Définir et mettre en œuvre 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 lorsque le MainWindows est construit (ou ailleurs). Par exemple

MainWindow::MainWindow(...) 
{ 
    ... 
    qApp->installEventFilter(this); 
    ... 
} 
+1

Merci, qui travaille pour obtenir des mises à jour en continu lorsque la souris est sur la fenêtre d'application, mais si la souris se déplace ailleurs, la position ne met pas à jour. – Switch

+0

Pour suivre la souris en dehors de la fenêtre, vous devez saisir la souris (voir QWidget :: grabMouse()). Puisque tous les événements de souris seront envoyés au widget qui a attrapé la souris, cela empêchera une interaction normale avec d'autres widgets, sauf si vous ne saisissez la souris que lorsque la souris quitte la fenêtre (dans leaveEvent()) puis relâchez la souris sur enterEvent(). – baysmith

+0

Après avoir ajouté grabMouse(), il met à jour encore que lorsque la souris passe au-dessus de la fenêtre de l'application – Switch

1

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

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

+0

QMainWindow n'a pas de méthode viewport(). – user1482030