functions - Obteniendo MouseMoveEvents en Qt
qwidget functions (2)
En mi programa, me gustaría que mouseMoveEvent (evento QMouseEvent *) se llame siempre que el mouse se mueva (incluso cuando esté sobre otra ventana).
En este momento, en mi archivo mainwindow.cpp, tengo:
void MainWindow::mouseMoveEvent(QMouseEvent* event) {
qDebug() << QString::number(event->pos().x());
qDebug() << QString::number(event->pos().y());
}
Pero parece que solo se llama cuando hago clic y arrastro el mouse sobre la ventana del programa. He intentado llamar
setMouseTracking(true);
en el constructor de MainWindow, pero parece que no hace nada diferente (mouseMoveEvent todavía solo se invoca cuando presiono un botón del mouse, independientemente de dónde esté). ¿Cuál es la forma más fácil de seguir la posición del mouse globalmente?
Puede usar un filtro de eventos en la aplicación.
Definir e implementar 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;
}
Instale el filtro de eventos cuando se construye MainWindows (o en otro lugar). Por ejemplo
MainWindow::MainWindow(...)
{
...
qApp->installEventFilter(this);
...
}
Tuve el mismo problema, agravado aún más por el hecho de que estaba tratando de llamar a this->update()
para volver a pintar la ventana en el movimiento del mouse y no pasaría nada.
Puede evitar tener que crear el filtro de eventos llamando a setMouseTracking(true)
como anotó @Kyberias. Sin embargo, esto debe hacerse en la ventana , no en su ventana principal. (Lo mismo ocurre con la actualización).
Entonces, en su constructor puede agregar una línea this->viewport()->setMouseTracking(true)
y luego anular mouseMoveEvent
lugar de crear este filtro e instalarlo.