Obtener MouseMoveEvents en Qt


En mi programa, me gustaría tener mouseMoveEvent(QMouseEvent* event) llamado cada vez que el ratón se mueve (incluso cuando está sobre otra ventana).

Ahora mismo, en mi ventana principal.archivo cpp, tengo:

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

Pero esto parece que solo se llama cuando hago clic y arrastre el ratón mientras que sobre la ventana del propio programa. He intentado llamar

setMouseTracking(true);

En el constructor de MainWindow, pero esto no parece hacer nada diferente (mouseMoveEvent todavía solo se llama cuando sostengo un botón del ratón hacia abajo, independientemente de dónde esté). ¿Cuál es la forma más fácil de rastrear la posición del ratón globalmente?

Author: Switch, 2009-12-20

2 answers

Puede utilizar 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 la ventana principal (o en otro lugar). Por ejemplo

MainWindow::MainWindow(...)
{
  ...
  qApp->installEventFilter(this);
  ...
}
 34
Author: baysmith,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-12-20 07:23:21

Tuve el mismo problema, exacerbado aún más por el hecho de que estaba tratando de llamar a this->update() para 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 a setMouseTracking(true) como @Kyberias señaló. Sin embargo, esto debe hacerse en el vieport , no en su ventana principal en sí. (Lo mismo ocurre con la actualización).

Así que en su constructor puede agregar una línea this->viewport()->setMouseTracking(true) y luego reemplazar mouseMoveEvent en lugar de crear este filtro e instalar se.

 2
Author: pelesl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-06-21 00:01:01