问:如何过滤意外(连续)MouseButtonRelease和MouseButtonPress事件?

时间:2011-12-05 09:36:30

标签: qt events filter touchscreen

我的问题是电阻式触摸屏很差。当您在屏幕上拖动手指时。由于MouseButtonRelease事件,拖动随机切断。

我想通过过滤mouseEvents并删除所有连续的MouseButtonRelease和MouseButtonPress事件来解决这个问题。不到100毫秒的appart。我想在整个应用程序范围内这样做。

我已经尝试了一个eventFilter,但它无法正常工作。存储的MouseButtonRelease事件不会发送到正确的对象。我通过installEventFilter(new MouseFilter(this))安装了这个;在一个小部件,但所有鼠标版本都会丢失。

您是否建议使用其他方法或我的代码有问题?

#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 个答案:

答案 0 :(得分:1)

你处在痛苦的世界里,去过那里。我向硬件人抱怨并无处可去。

一种方法可能是自己完成所有发布活动。基本上,当手指接触时,您会得到一个事件(即使它是静止的)。因此,基于该逻辑,您可以启动计时器,然后在100毫秒无触摸事件后,您将关闭鼠标释放。

QTimer的工作方式是你可以反复调用.start(),它会重新开始倒计时。

当然,这充满了问题,因为它依赖于100毫秒的幻数,它降低了应用程序的响应能力,并且只修复了应用程序中的错误,而不是系统范围内的错误。