在Qt中获取MouseMoveEvents

Swi*_*tch 31 mouse qt mouseevent

在我的程序中,我想在鼠标移动时调用mouseMoveEvent(QMouseEvent*event)(即使它在另一个窗口上).

现在,在我的mainwindow.cpp文件中,我有:

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

但是,当我在程序本身的窗口上单击并拖动鼠标时,似乎只会调用它.我试过打电话

setMouseTracking(true);
Run Code Online (Sandbox Code Playgroud)

在MainWindow的构造函数中,但这似乎没有做任何不同的事情(只有当我按住鼠标按钮时,无论它在何处,都会调用mouseMoveEvent).在全球范围内跟踪鼠标位置的最简单方法是什么?

bay*_*ith 34

您可以在应用程序上使用事件过滤器.

定义并实现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;
}
Run Code Online (Sandbox Code Playgroud)

构造MainWindows时(或其他地方)安装事件过滤器.例如

MainWindow::MainWindow(...)
{
  ...
  qApp->installEventFilter(this);
  ...
}
Run Code Online (Sandbox Code Playgroud)

  • 使用grabMouse()对我有用,但它确实会对尝试与多个窗口进行交互产生负面影响.另一种选择是使用QTimer连续轮询可以使用QCursor :: pos()检索的鼠标位置. (4认同)
  • 谢谢,当鼠标悬停在应用程序窗口上时,这可以持续更新,但如果鼠标移动到其他地方,位置不会更新。 (2认同)