Qt5.5 How to override MousePress event coordinates at Application level
我正在使用Qt5.5在小型嵌入式Linux设备上开发应用程序。我需要能够在应用程序中修改从Linux(tslib)接收到的鼠标按下坐标。我尝试在主视图中实现事件过滤器,该事件过滤器修改接收到的鼠标坐标,创建新的鼠标事件并将新事件提交给小部件。但是,在小部件的mousePressEvent函数中,我只看到一次调试消息,它是针对收到的原始坐标的,而不是针对我截获和修改的坐标的。
当前,当我触摸屏幕时,我收到了调试消息,它们看起来像这样:
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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:
1 2 3 | MyWidget w; app.installEventFilter(&w); w.show(); |
MyWidget:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | 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(); } |
您可以"消费"事件并通过从
您可以使用静态方法
重新发布您创建的事件
此外,您可能希望拦截更深的内容,例如在
此外,如果要产生点击,则必须连续发布两个事件,即按下和释放事件:
1 2 3 4 | 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); |