Qt,手势。无法识别TapAndHold和Swipe

时间:2013-01-14 12:58:24

标签: qt gesture

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

  • TapGesture
  • TapAndHoldGesture
  • PanGesture
  • PinchGesture
  • SwipeGesture

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

 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无法识别? 这些手势同样实现为可识别的三个手势(平移,捏合和敲击)。为什么它不起作用?

我感谢你提前帮助

2 个答案:

答案 0 :(得分:4)

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

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

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

回到QGestureOverride类型的QEvent:Qt.QEvent枚举显示“Qt.QGestureOverride ...(QGestureEvent)”,这对我来说意味着QGestureOverride类型的事件是QGestureEvent的子类,但它不是:没有对QGestureOverride类型的事件的gestures()方法。 (那么如何知道你接受的是什么样的手势覆盖?)而且似乎忽略事件的默认情况不仅仅是允许它传播,而是阻止所包含(sic)手势的后续事件(无论他们是什么。)

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

答案 1 :(得分:0)

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