2009-12-20 1 views
29

В моей программе я бы хотел, чтобы mouseMoveEvent (событие QMouseEvent *) вызывалось всякий раз, когда мышь перемещается (даже когда она находится над другим окном).Получение MouseMoveEvents в Qt

Прямо сейчас, в моем файле mainwindow.cpp, у меня есть:

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

Но это, кажется, называется только тогда, когда я нажимаю и перетащить мышью в то время как над окном самой программы. Я попытался назвать

setMouseTracking(true); 

в конструкторе MainWindow, но это, кажется, не делать ничего по-другому (mouseMoveEvent еще только вызывается, когда я держу кнопку мыши, независимо от того, где он есть). Какой самый простой способ отслеживать положение мыши по всему миру?

ответ

32

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

Определить и реализовать 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); 
    ... 
} 
+1

Спасибо, что работает для получения непрерывных обновлений, когда мышь находится над окном приложения, но если мышь перемещается в другом месте, позиция не обновляется. – Switch

+0

Чтобы отследить мышь за окном, вам нужно будет захватить мышь (см. QWidget :: grabMouse()). Поскольку все события мыши будут отправлены виджету, который захватил мышь, это предотвратит нормальное взаимодействие с другими виджетами, если только вы не захватите мышь только тогда, когда мышь покидает окно (в файле leaveEvent()), а затем отпустите мышь на enterEvent(). – baysmith

+0

После добавления grabMouse() он все еще обновляется, когда мышь проходит над окном приложения. – Switch

1

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

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

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

+0

QMainWindow не имеет метода viewport(). – user1482030

 Смежные вопросы

  • Нет связанных вопросов^_^