在 Qt 中获取 MouseMoveEvents

Posted

技术标签:

【中文标题】在 Qt 中获取 MouseMoveEvents【英文标题】:Getting MouseMoveEvents in Qt 【发布时间】:2010-12-28 10:43:35 【问题描述】:

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

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

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

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

setMouseTracking(true);

在 MainWindow 的构造函数中,但这似乎没有什么不同(mouseMoveEvent 仍然只在我按住鼠标按钮时才被调用,无论它在哪里)。全局跟踪鼠标位置的最简单方法是什么?

【问题讨论】:

【参考方案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);
  ...

【讨论】:

谢谢,当鼠标悬停在应用程序窗口上时,它可以持续更新,但如果鼠标移动到其他地方,位置不会更新。 要在窗口外跟踪鼠标,您需要抓住鼠标(参见 QWidget::grabMouse())。由于所有鼠标事件都将发送到已抓取鼠标的小部件,这将阻止与其他小部件的正常交互,除非您仅在鼠标离开窗口时才抓住鼠标(在 leaveEvent() 中)然后释放鼠标在 enterEvent() 上。 添加grabMouse()后,仍然只在鼠标经过应用窗口时更新 使用 grabMouse() 对我有用,但它确实会对尝试与多个窗口进行交互产生负面影响。另一种选择是使用 QTimer 连续轮询鼠标位置,可以使用 QCursor::pos() 检索。 我认为这不是一个正确的答案。要获得连续的鼠标事件,只需调用 setMouseTracking(true)。要在窗口外抓取鼠标,必须使用上述的 grabMouse()。【参考方案2】:

我也遇到了同样的问题,因为我试图调用 this-&gt;update() 以在鼠标移动时重新绘制窗口但什么都不会发生,这进一步加剧了这种情况。

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

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

【讨论】:

QMainWindow 没有 viewport() 方法。

以上是关于在 Qt 中获取 MouseMoveEvents的主要内容,如果未能解决你的问题,请参考以下文章

Qt中如何获取某个控件的指针地址

如何在 Qt 中获取文件的 MIME 类型?

在 Qt 中获取 MouseMoveEvents

如何在 Qt 中获取选定的列表项索引

使用 C++\Qt 从当前窗口中获取选定的文本

如何在 Qt 中获取输出 system() 命令?