2009-12-20 17 views
29

En mi programa, me gustaría que mouseMoveEvent (evento QMouseEvent *) se llame siempre que el mouse se mueva (incluso cuando esté sobre otra ventana).Obteniendo MouseMoveEvents en Qt

En este momento, en mi archivo mainwindow.cpp, que tienen:

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

pero esto parece ser llamado sólo cuando hago clic y arrastrar el ratón mientras que más de la ventana del programa en sí. He intentado llamar

setMouseTracking(true); 

en el constructor del MainWindow, pero esto no parece hacer nada diferente (mouseMoveEvent todavía sólo se llama cuando yo tenga un botón del ratón, independientemente de donde está). ¿Cuál es la forma más fácil de seguir la posición del mouse globalmente?

Respuesta

32

Puede usar un filtro de eventos en la aplicación.

Defina e implemente bool MainWindow :: eventFilter (QObject *, QEvent *). Por ejemplo

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

Instalar el filtro de evento cuando los MainWindows se construye (otra cosa, o en algún lugar). Por ejemplo

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

Gracias, eso funciona para obtener actualizaciones continuas cuando el mouse está sobre la ventana de la aplicación, pero si el mouse se mueve a otra parte, la posición no se actualiza. – Switch

+0

Para rastrear el mouse fuera de la ventana, necesitarás agarrar el mouse (ver QWidget :: grabMouse()). Dado que todos los eventos del mouse se enviarán al widget que ha capturado el mouse, esto evitará la interacción normal con otros widgets, a menos que solo agarre el mouse cuando el mouse abandone la ventana (en leaveEvent()) y luego suelte el mouse en enterEvent(). – baysmith

+0

Después de agregar grabMouse(), solo se actualiza cuando el mouse pasa sobre la ventana de la aplicación – Switch

1

que tenía el mismo problema, agravado aún más por el hecho de que yo estaba tratando de llamar this->update() volver a pintar la ventana en un movimiento del ratón y no pasaría nada.

Puede evitar tener que crear el filtro de eventos llamando al setMouseTracking(true) como anotó @Kyberias. Sin embargo, esto debe hacerse en el vieport, no en su ventana principal. (Lo mismo ocurre con la actualización).

De modo que en su constructor puede agregar una línea this->viewport()->setMouseTracking(true) y luego anular mouseMoveEvent en lugar de crear este filtro e instalarlo.

+0

Un QMainWindow no tiene un método viewport(). – user1482030