在Qt中获取MouseMoveEvents
在我的程序中,我希望在鼠标移动时调用mouseMoveEvent(QMouseEvent*event)(即使它位于另一个窗口上) 现在,在mainwindow.cpp文件中,我有:在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-&
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);
...
}