我正在使用Qt5.5在小型嵌入式Linux设备上开发应用程序。我需要能够在我的应用程序中修改从Linux(tslib)收到的鼠标按键坐标。我尝试在主视图中实现一个事件过滤器,修改收到的鼠标坐标,创建一个新的鼠标事件并将新事件提交给窗口小部件。但是,在widget的mousePressEvent函数中,我只看到调试消息一次,它是针对接收到的原始坐标,而不是我截取和修改的坐标。
目前,当我触摸屏幕时,我收到调试消息,它们看起来像这样:
Mouse Original: QPoint(192,148)
Mouse New: QPoint(128,148)
Mouse Original: QPoint(192,148)
Mouse New: QPoint(128,148)
Mouse Original: QPoint(192,148)
Mouse New: QPoint(128,148)
Mouse Original: QPoint(192,148)
Mouse New: QPoint(128,148)
Mouse Original: QPoint(192,148)
Mouse New: QPoint(128,148)
Mouse Original: QPoint(192,148)
Mouse New: QPoint(128,148)
Mouse Press 192 148
如何拦截顶层的鼠标事件,修改它们的坐标,并将它们发布到我的窗口小部件,同时还消耗原始鼠标事件?谢谢!
main.cpp中:
MyWidget w;
app.installEventFilter(&w);
w.show();
进myWidget:
bool MyWidget::eventFilter(QObject *object, QEvent *event)
{
if ( event->type() == QEvent::MouseButtonPress ) {
QMouseEvent *orig = static_cast<QMouseEvent*>( event );
QPoint origLocation = orig->pos();
qDebug() << "Mouse Original: "<< origLocation;
int newx = abs(origLocation.x()-320);
QPoint newPoint(newx,origLocation.y());
QMouseEvent *newPosEvent = new QMouseEvent(QEvent::MouseButtonPress, newPoint, Qt::LeftButton, Qt::LeftButton, Qt::NoModifier);
qDebug() << "Mouse New: " << newPosEvent->pos();
//qApp->postEvent(this, newPos);
return QObject::eventFilter(object, newPosEvent);
}
return QObject::eventFilter(object, event);
}
void MyWidget::mousePressEvent ( QMouseEvent * event )
{
qDebug() << "Mouse Press" << event->x() << event->y();
}
答案 0 :(得分:1)
您可以通过从true
方法返回eventFilter()
来“消费”该事件并停止其进一步传播。如果您不使用事件过滤器,则可以使用accept()
方法停止事件。
您可以使用静态方法QCoreApplication::postEvent(obj, evnt);
此外,您可能希望更深入地拦截,例如在QWindow
级别。我的意思是,如果你在你的小部件级别拦截它,并再次将它发布到你的小部件,它将再次被事件过滤器拦截。您不会发布新活动,并且您收到原始活动,因为您没有阻止它传播。
此外,如果您想要生成点击,则必须连续发布两个事件,即按下和发布事件:
QMouseEvent * e1 = new QMouseEvent(QEvent::MouseButtonPress, QPointF(x, y), Qt::MouseButton::LeftButton, Qt::MouseButton::LeftButton, Qt::KeyboardModifier::NoModifier);
QCoreApplication::postEvent(obj, e1);
QMouseEvent * e2 = new QMouseEvent(QEvent::MouseButtonRelease, QPointF(x, y), Qt::MouseButton::LeftButton, Qt::MouseButton::LeftButton, Qt::KeyboardModifier::NoModifier);
QCoreApplication::postEvent(obj, e2);