关于qt:Qt5.5如何在应用程序级别覆盖MousePress事件坐标

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();
}

您可以"消费"事件并通过从eventFilter()方法返回true停止事件的进一步传播。如果不使用事件过滤器,则可以使用其accept()方法停止事件。

您可以使用静态方法QCoreApplication::postEvent(obj, evnt);

重新发布您创建的事件

此外,您可能希望拦截更深的内容,例如在QWindow级别。我的意思是,如果您在小部件级别对其进行拦截,然后再次将其发布到小部件中,则它将再次被事件过滤器拦截。您没有发布新事件,而是收到了原始事件,因为您没有阻止它传播。

此外,如果要产生点击,则必须连续发布两个事件,即按下和释放事件:

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);