Получение MouseMoveEvents в Qt - PullRequest
       27

Получение MouseMoveEvents в Qt

31 голосов
/ 20 декабря 2009

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

Ответы [ 2 ]

34 голосов
/ 20 декабря 2009

Вы можете использовать фильтр событий в приложении.

Определить и реализовать 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);
  ...
}
3 голосов
/ 21 июня 2015

У меня была та же проблема, еще более усугубленная тем, что я пытался вызвать this->update(), чтобы перекрасить окно движением мыши, и ничего не произошло.

Вы можете избежать создания фильтра событий, вызвав setMouseTracking(true), как заметил @Kyberias. Однако это должно быть сделано на vieport , а не на самом главном окне. (То же самое касается обновления).

Таким образом, в вашем конструкторе вы можете добавить строку this->viewport()->setMouseTracking(true) и затем переопределить mouseMoveEvent вместо создания этого фильтра и его установки.

...