【问题标题】:Qt: How to filter accidental (consecutive) MouseButtonRelease and MouseButtonPress events?Qt:如何过滤意外(连续)MouseButtonRelease 和 MouseButtonPress 事件?
【发布时间】:2011-12-05 09:36:30
【问题描述】:

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

我想通过过滤 mouseEvents 并删除所有连续的 MouseButtonRelease 和 MouseButtonPress 事件(如果它们发生)来解决这个问题,例如小于 100 毫秒的设备。我想在整个应用程序范围内执行此操作。

我已经尝试过一个 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);
}

【问题讨论】:

  • 您不能使用操作系统(触摸屏驱动程序)来执行此操作吗?这将是这种行为(不是应用程序)更自然的地方,但我猜这可能是不切实际的。
  • 这篇文章有帮助吗? qtcentre.org/threads/… 她建议将enterEventleaveEventQTimer 结合使用。
  • 您也可以使用“拖动锁定”机制(在 Mac OS X 上很常见)。它需要“双击”开始拖动并点击结束。
  • 我想我会等待我们设备的下一个触摸屏版本。它应该更好。你是对的,触摸屏驱动程序会更自然地放置过滤器。

标签: qt events filter touchscreen


【解决方案1】:

你在一个痛苦的世界里,一直在那里。我向硬件人员抱怨过,但一无所获。

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

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

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

【讨论】:

    猜你喜欢
    • 2018-09-07
    • 2022-01-17
    相关资源
    最近更新 更多