【问题标题】:Qt, Gestures. TapAndHold and Swipe are not recognizedQt,手势。 TapAndHold 和 Swipe 无法识别
【发布时间】:2013-01-14 12:58:23
【问题描述】:

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

感谢您的帮助

【问题讨论】:

  • 你发现了吗?我也想了解 QListWidget 中的手势捕获。
  • 你解决了吗?我也面临同样的问题。

标签: qt gesture


【解决方案1】:

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

在 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 上,Pan(滚动操作)是用两个手指,正如设备驱动程序或控制面板所定义的那样?)

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多