Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Qt中获取MouseMoveEvents_Qt_Mouse_Mouseevent - Fatal编程技术网

在Qt中获取MouseMoveEvents

在Qt中获取MouseMoveEvents,qt,mouse,mouseevent,Qt,Mouse,Mouseevent,在我的程序中,我希望在鼠标移动时调用mouseMoveEvent(QMouseEvent*event)(即使它位于另一个窗口上) 现在,在mainwindow.cpp文件中,我有: void MainWindow::mouseMoveEvent(QMouseEvent* event) { qDebug() << QString::number(event->pos().x()); qDebug() << QString::number(event-&

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

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

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

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

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

定义并实现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;
}
MainWindow::MainWindow(...)
{
  ...
  qApp->installEventFilter(this);
  ...
}

我也有同样的问题,更糟糕的是,我试图调用
this->update()
在鼠标移动时重新绘制窗口,但什么也不会发生

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


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

谢谢,当鼠标位于应用程序窗口上方时,这可以获得连续更新,但如果鼠标移到其他位置,位置没有更新。要在窗口外跟踪鼠标,需要抓取鼠标(请参阅QWidget::grabMouse()。由于所有鼠标事件都将发送到抓取鼠标的小部件,这将阻止与其他小部件的正常交互,除非您仅在鼠标离开窗口时(在leaveEvent()中)抓取鼠标,然后在enterEvent()上释放鼠标。添加grabMouse()后,它仍然只在鼠标经过应用程序窗口时更新使用grabMouse()对我来说很有用,但它确实会对尝试与多个窗口交互产生负面影响。另一种选择是使用QTimer连续轮询鼠标位置,可以使用QCursor::pos()检索鼠标位置。我认为这不是正确的答案。要获得连续的鼠标事件,只需调用setMouseTracking(true)。要在窗口外抓取鼠标,必须使用前面提到的grabMouse()。QMainWindow没有viewport()方法。
MainWindow::MainWindow(...)
{
  ...
  qApp->installEventFilter(this);
  ...
}