Qt: Как отфильтровать случайные (последовательные) события MouseButtonRelease и MouseButtonPress? - PullRequest
2 голосов
/ 05 декабря 2011

Моя проблема - плохой резистивный сенсорный экран. Когда вы проводите пальцем по экрану. Перетаскивание случайно прерывается из-за события MouseButtonRelease.

Я бы хотел это исправить, отфильтровав mouseEvents и удалив все последовательные события MouseButtonRelease и MouseButtonPress, если они произошли, например. менее 100 мс Я хотел бы сделать это для всего приложения.

Я уже пробовал eventFilter, но он не работает должным образом. Сохраненные события MouseButtonRelease не отправляются нужным объектам. Я установил это с помощью installEventFilter (новый MouseFilter (это)); в виджете, но все выпуски мыши теряются.

Вы предлагаете другой подход или что-то не так с моим кодом?

#include "mousefilter.h"
#include <QApplication>
#include <QEvent>
#include <QMouseEvent>
#include <QTimer>

MouseFilter::MouseFilter(QObject *parent) :
  QObject(parent),
  storedEvent_(0)
{
}

void MouseFilter::send() {
  if ( storedEvent_ == 0 ) {
    return;
  }
  QApplication::sendEvent(parent(), storedEvent_);
  delete storedEvent_;
  storedEvent_ = 0;
}

bool MouseFilter::eventFilter(QObject *object, QEvent *event) {
  if ( event->type() == QEvent::MouseButtonRelease ) {
    QMouseEvent* release = static_cast<QMouseEvent*>(event);
    // Dalay the event
    storedEvent_ = new QMouseEvent(QEvent::MouseButtonRelease, release->pos(), release->globalPos(),
                                   release->button(), release->buttons(), release->modifiers());
    QTimer::singleShot(100, this, SLOT(send()));
    return true;
  }
  else if ( storedEvent_ != 0 && event->type() == QEvent::MouseButtonPress ) {
    // Clear stored release and ignore new press.
    delete storedEvent_;
    storedEvent_ = 0;
    return true;
  }

  return QObject::eventFilter(object, event);
}

1 Ответ

1 голос
/ 20 декабря 2011

Ты был в мире боли, был там. Я жаловался на аппаратных специалистов и никуда не попал.

Подход может заключаться в том, чтобы сделать все события релиза самостоятельно. В основном, когда палец находится в контакте, вы получаете событие (даже если оно неподвижно). Поэтому, основываясь на этой логике, вы можете запустить таймер, а после 100 мс без событий касания вы отпустите кнопку мыши.

Способ, которым работает QTimer, состоит в том, что вы можете повторно вызывать .start (), и он возобновит обратный отсчет.

Конечно, это связано с проблемами в том смысле, что оно зависит от магического числа 100 мс, оно уменьшает скорость отклика вашего приложения и исправляет только ошибку в вашем приложении не в масштабе всей системы, как должно быть.

...