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?
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);
...
}
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.
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