12

我尝试了来自http://doc.qt.digia.com/4.6/gestures-imagegestures.html的“图像手势示例” 。在此示例中,您只有 3 个手势:PanGesture、PinchGesture 和 SwipeGesture。但 Qt 提供了 5 种手势:

  • 点击手势
  • 点击并按住手势
  • 泛手势
  • 捏手势
  • 滑动手势

为了识别所有 5 个手势,我们需要写入 ImageWidget-Constructor:

 grabGesture(Qt::TapGesture);
 grabGesture(Qt::TapAndHoldGesture);
 grabGesture(Qt::PanGesture);
 grabGesture(Qt::PinchGesture);
 grabGesture(Qt::SwipeGesture);

我还添加了方法gestureEvent()

bool ImageWidget::gestureEvent(QGestureEvent *event)
 {
     if (QGesture *swipe = event->gesture(Qt::SwipeGesture))
         swipeTriggered(static_cast<QSwipeGesture *>(swipe));
     else if (QGesture *pan = event->gesture(Qt::PanGesture))
         panTriggered(static_cast<QPanGesture *>(pan));
     if (QGesture *pinch = event->gesture(Qt::PinchGesture))
         pinchTriggered(static_cast<QPinchGesture *>(pinch));
     if (QGesture *tap = event->gesture(Qt::TapGesture))
         tapTriggered(static_cast<QTapGesture *>(tap));
     if (QGesture *tapandhold = event->gesture(Qt::TapAndHoldGesture))
     {
         tapandholdTriggered(static_cast<QTapAndHoldGesture *>(tapandhold));
      }
     return true;
 }

并编写缺少的方法,例如

void ImageWidget::tapTriggered(QTapGesture *gesture)
 {
    qDebug() << "TAP" << gesture->position();
 }

 void ImageWidget::tapandholdTriggered(QTapAndHoldGesture *tapandhold)
 {
     qDebug() << "TAPANDHOLD";
 }

所以,我的问题是,为什么手势 Swipe 和 TapAndHold 无法识别?这些手势同样实现为三个可识别的手势(平移、捏合和轻敲)。为什么它不起作用?

我提前感谢您的帮助

4

2 回答 2

4

同样,如果您描述您的平台和触摸硬件,这将有所帮助。

在 OSX、Qt5、PyQt 上,使用 Apple TouchPad,我发现某些手势事件不会到达,除非您接受 QGestureOverride 类型的 QEvent。文档对此类事件的目的非常模糊。文档确实说默认情况下会忽略它,这是例外:默认情况下接受大多数其他手势,这意味着同一手势的更多事件将会到来。

这种“接受”手势的含义不同于“接受”事件的一般含义。“接受”一个手势似乎意味着“让更多事件发生”,而“接受”一个事件意味着“不要通过小部件链传播这个事件”。此外,文档对于接受 QGestureEvent 与接受 QGesture 非常混淆。QGestureEvent 是 QGesture 的组合。接受 QGestureEvent 是否与接受包含的手势相同是非常令人困惑的。注意QGesture没有accept()方法,QGestureEvent有几个重载和方便的方法:accept(), setAccepted(bool), setAccepted(gesture, bool), setAccepted(gestureType, bool)等。

回到 QGestureOverride 类型的 QEvent:Qt.QEvent 枚举显示“Qt.QGestureOverride ...(QGestureEvent)”,这对我来说意味着 QGestureOverride 类型的事件是 QGestureEvent 的子类,但它不是:没有手势() QGestureOverride 类型事件的方法。(那么如何知道您正在接受哪种手势覆盖?)而且似乎忽略事件的默认设置不仅允许它传播,而且阻止包含的(原文如此)手势的后续事件(不管它们是什么。)

例如,在我的一些测试中,真正的两指捏合从未生成任何具有 Pinch 类型手势的手势事件,但确实生成了 Pan 类型,直到我接受 QGestureOverride 类型的 QEvent。然后,Pinch 手势事件首先出现,然后是 Pinch 和 Pan 手势事件,当我在捏的时候或在我捏之后草率地平移我的两根手指时。(请注意,至少在 OSX TrackPad 上,平移(滚动操作)是用两个手指,由设备驱动程序或控制面板定义的相同?)

于 2014-01-08T14:55:57.497 回答
0

尝试更新版本的 Qt(并且您没有提及您的操作系统或设备。)我不知道更新版本会更好,但我知道大约一年前,整个堆栈(X11 事件,设备驱动程序、操作系统支持等)不断变化且不完整。例如,我记得在我尝试的时候,只有 Windows 上的 Qt 中的手势有效,并且 Linux/Ubuntu(来自 Canonical)正在进行中。

于 2013-10-21T15:54:03.937 回答