在Qt中获取MouseMoveEvents

问题描述 投票:31回答:2

在我的程序中,我希望每当鼠标移动(即使它在另一个窗口上时)都调用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都只会被调用)。全局跟踪鼠标位置的最简单方法是什么?

qt mouse mouseevent
2个回答
35
投票

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

定义并实现布尔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);
  ...
}

4
投票

我遇到了同样的问题,由于我试图通过鼠标移动来调用this->update()重绘窗口,所以一无所获。

您可以通过按@Kyberias的说明调用setMouseTracking(true)来避免创建事件过滤器。但是,这必须在viewport而不是主窗口本身上完成。 (同样用于更新)。

因此,在您的构造函数中,您可以添加一行this->viewport()->setMouseTracking(true),然后覆盖mouseMoveEvent,而不是创建此过滤器并安装它。

© www.soinside.com 2019 - 2024. All rights reserved.