为什么我的QGestureRecognizer无法接收触摸事件?

4

背景:我正在尝试创建一个类似于淡入淡出效果的小部件,可以在同一视图中具有多个实例,每个实例都可以由不同手指同时控制。

我想使用Qt的手势识别系统,但是我还需要一些超出标准Qt::PanGesture功能的功能。为此,我继承了QGestureQGestureRecognizer。在FooGestureRecognizer :: recognize(...)中,我目前拦截QMouseEventQTouchEvent(至少现在是这样)。

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

  • QEvent :: MouseButtonPress
  • 一系列QEvent :: MouseMove
  • 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正在从TouchEvent合成MouseEvent,为什么我会看到“QEvent :: MouseMove”和“QEvent :: MouseButtonRelease”,但看不到“QEvent :: TouchUpdate”或“QEvent :: TouchRelease”?
代码可用,但为了简洁起见,我没有在此处包含它。如果需要,请询问。
1个回答

4

QTouchEvent文档中:

发送 QEvent::TouchUpdate 和 QEvent::TouchEnd 事件到接受 QEvent::TouchBegin 事件的小部件或项。 如果 QEvent::TouchBegin 事件未被接受且未被事件过滤器过滤,则不会发送任何进一步的触摸事件,直到下一个 QEvent::TouchBegin。

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

  1. 创建一个由我的 QGestureRecognizer 拥有的细节事件过滤器 QObject

其中包含以下代码:

bool FooGestureRecognizer::FooEventFilter::eventFilter(QObject *Object, QEvent *Event)
{
  if(Event->type() == QEvent::TouchBegin)
  {
    return true;
  }
  else
  {
    return QObject::eventFilter(Object, Event);
  }
}

安装我的事件过滤器,并在每个有效的Target通过FooGestureRecognizer::create()时调用setAttribute(Qt::WA_AcceptTouchEvents)
eventFilter返回true告诉Qt我的淡入淡出效果有兴趣接收更多触摸事件,并且这些触摸事件如预期的那样被传递给手势识别器。
这种解决方案感觉像一个hack,而且在未来的Qt版本中可能不需要,所以我会密切关注这段代码。
注意:
在构建QGestureRecognizer时,create()将使用空的Target(期望返回虚拟的QGesture)。如果您正在为所有Target安装事件过滤器,请注意这一点。
我的应用程序需要以一种方式处理桌面鼠标事件,以另一种方式处理多指触摸事件,因此我已禁用Qt::AA_SynthesizeMouseForUnhandledTouchEvents。保持启用可能会导致其他考虑因素(例如,我不确定您是否需要在eventFilter中为所有触摸事件返回true,以避免它们作为合成的鼠标事件被复制)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接