Qt5.5 Как переопределить координаты события MousePress на уровне приложения

Я разрабатываю приложение на небольшом устройстве Embedded Linux с Qt5.5. Мне нужно иметь возможность изменять координаты нажатия мыши, полученные из Linux ( tslib ), в моем приложении. Я попытался реализовать фильтр событий в своем основном представлении, который изменяет полученную координату мыши, создает новое событие мыши и отправляет новое событие в виджет. Однако в функции виджета 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

Как я могу перехватывать события мыши на верхнем уровне, изменять их координаты и публиковать их в своем виджете, одновременно используя исходные события мыши? Спасибо!

основной.cpp:

MyWidget w;
app.installEventFilter(&w);
w.show();

Мой виджет:

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

person PhilBot    schedule 04.10.2015    source источник


Ответы (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);
person dtech    schedule 04.10.2015