上下文:我正在尝试创建一个类似推子的小部件,它可以在同一 View 中有多个实例,每个实例都可以由不同的手指同时控制。

我想使用 Qt 的 gesture recognition system ,但我还需要一些超出标准 Qt::PanGesture 的功能。为此,我对 QGestureQGestureRecognizer 进行了子类化。在 FooGestureRecognizer::recognize(...) 中,我目前正在拦截 QMouseEvent s 和 QTouchEvent s(至少目前是这样)。

在 Windows 上,我只收到 QMouseEvent s - 我处理它们并且一切都按预期工作(尽管当我的输入来自物理鼠标时,显然我不必处理多点触控问题)。我收到的事件(按顺序):

  • QEvent::MouseButtonPress
  • 一串QEvent::MouseMove s
  • QEvent::MouseButtonRelease

  • 在 Android 上,我收到了 QMouseEventQTouchEvent 的奇怪组合(按顺序):
  • QEvent::TouchBegin
  • QEvent::MouseButtonPress
  • QEvent::MouseMove(位置没有实际变化)
  • 另一个 QEvent::MouseButtonPress(不知道为什么我需要另一个)
  • 我的实际 QEvent::MouseMove 字符串,正如预期的那样
  • QEvent::MouseButtonRelease

  • 全局属性 Qt::AA_SynthesizeMouseForUnhandledTouchEvents 默认为 true。关闭它会将我收到的事件更改为:
  • QEvent::TouchBegin

  • ...没有其他的。

    这是一个前置问题: 我可以在 QGestureRecognizer::recognize() 中做什么来告诉 Qt 我正在处理 QEvent::TouchBegin ,并且它不需要为我合成 QEvent::MouseButtonPress event->accept() 似乎没有任何区别。

    实际问题: 如果(看起来)Qt 正在从 MouseEvent s 合成 TouchEvent s,为什么我看到我看到 QEvent::MouseMoveQEvent::MouseButtonRelease 而不是 QEvent::TouchUpdateQEvent::TouchRelease

    代码可用,但为了简洁起见,我没有将其包含在此处。如果需要请询问。

    最佳答案

    QTouchEvent docs :



    这个问题的根源是 QGestureRecognizer 不接受初始的 TouchBegin ,因此我们不会收到任何进一步的触摸事件。我通过以下方式解决了这个问题:

  • 创建我的 QObject 拥有的瘦事件过滤器 QGestureRecognizer

  • 包含以下代码:
    bool FooGestureRecognizer::FooEventFilter::eventFilter(QObject *Object, QEvent *Event)
    {
      if(Event->type() == QEvent::TouchBegin)
      {
        return true;
      }
      else
      {
        return QObject::eventFilter(Object, Event);
      }
    }
    
  • 安装我的事件过滤器并在通过 setAttribute(Qt::WA_AcceptTouchEvents) 的每个有效* Target 上调用 FooGestureRecognizer::create()

  • true 返回 eventFilter 告诉 Qt 我的推子有兴趣接收更多的触摸事件,这些触摸事件按预期传递给手势识别器。

    这个解决方案感觉像是一个黑客,在 Qt 的 future 版本中可能不需要这个解决方案,所以我将密切关注这段代码。

    笔记:
  • QGestureRecognizer 的构建过程中, create() 被调用时带有一个 null Target(期望返回一个虚拟的 QGesture)。如果您在所有 Target 上安装事件过滤器,请注意这一点。
  • 我的应用程序需要以一种方式处理桌面鼠标事件,并以另一种方式处理多指触摸事件,所以我禁用了 Qt::AA_SynthesizeMouseForUnhandledTouchEvents 。保持启用可能会导致其他考虑(例如,我不确定您是否需要为 return true 中的所有触摸事件使用 eventFilter ,以避免它们被复制为合成鼠标事件)。
  • 关于android - 为什么我的 QGestureRecognizer 没有收到触摸事件?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23369431/

    10-11 22:35