resizeevent functions contentsrect qt mouse mouseevent

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.