Подтвердить что ты не робот

Получение 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 все еще вызывается только тогда, когда я держу кнопку мыши, независимо от того, где она). Какой самый простой способ отслеживать положение мыши по всему миру?

4b9b3361

Ответ 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, а не создавать этот фильтр и устанавливать его.