Получение MouseMoveEvents в Qt
В моей программе я хочу, чтобы mouseMoveEvent (событие QMouseEvent *) вызывалось всякий раз, когда мышь перемещается (даже если она находится в другом окне).
Прямо сейчас, в моем файле mainwindow.cpp, у меня есть:
void MainWindow::mouseMoveEvent(QMouseEvent* event) {
qDebug() << QString::number(event->pos().x());
qDebug() << QString::number(event->pos().y());
}
Но это, кажется, только вызывается, когда я нажимаю и перетаскиваю мышь, находясь в окне самой программы. Я пробовал позвонить
setMouseTracking(true);
в конструкторе MainWindow, но это, похоже, не делает ничего по-другому (mouseMoveEvent все еще вызывается только тогда, когда я держу кнопку мыши, независимо от того, где она). Какой самый простой способ отслеживать положение мыши по всему миру?
Ответы
Ответ 1
Вы можете использовать фильтр событий в приложении.
Определить и реализовать bool MainWindow:: eventFilter (QObject *, QEvent *). Например
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;
}
Установите фильтр событий при создании MainWindows (или в другом месте). Например
MainWindow::MainWindow(...)
{
...
qApp->installEventFilter(this);
...
}
Ответ 2
У меня была та же проблема, что еще больше усугублялось тем фактом, что я пытался вызвать this->update()
, чтобы перерисовать окно при перемещении мыши, и ничего не произойдет.
Вы можете избежать необходимости создавать фильтр событий, вызывая setMouseTracking(true)
, как отмечал @Kyberias. Однако это должно быть сделано на vieport, а не на вашем основном окне. (То же самое касается обновления).
Итак, в вашем конструкторе вы можете добавить строку this->viewport()->setMouseTracking(true)
, а затем переопределить mouseMoveEvent
, а не создавать этот фильтр и устанавливать его.