2013-01-14 30 views
9

http://doc.qt.digia.com/4.6/gestures-imagegestures.htmlから「画像ジェスチャーの例」を試しました。この例では、ジェスチャ:PanGesture、PinchGesture、SwipeGestureの3つしかありません。我々はImageWidget、コンストラクタに書き込むために必要なすべての5つのジェスチャーを認識するためにSwipeGesture Qt、ジェスチャー。 TapAndHoldとスワイプが認識されない

  • PinchGesture
  • PanGesture
  • TapAndHoldGesture
  • TapGesture
    • :しかし、Qtは5つのジェスチャーを提供します:

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

      は、私は、私の質問は、なぜジェスチャースワイプとTapAndHoldが認識されていないされて

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

      のようなメソッドもする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; 
      } 
      

      と書き込み不足しているメソッドを追加しましたか? これらのジェスチャーは、認識される3つのジェスチャー(パン、ピンチ、タップ)として同様に実装されています。なぜそれは動作しません?

      私はQtのより新しいバージョンを試してみてください(そして、あなたのOSやデバイスに言及しないでください。)ヘルプ

    +0

    これはわかりましたか? QListWidgetでジェスチャーをキャプチャすることについても理解しようとしています。 –

    +0

    あなたはこれを解決しましたか?私も同じ問題に直面しています。 – Tarantula

    答えて

    0

    ために進めありがとう、私は、より新しいバージョンが良くなることを知りませんが、私は約1年前に、スタック全体(X11イベント、デバイスドライバ、オペレーティングシステムサポートなど)が流れていて不完全であったことを知っています。たとえば、私が試した時には、Windows上のQtのジェスチャーのみが動作し、Linux/Ubuntu(Canonical製)が進行中でした。

    2

    また、プラットフォームとタッチハードウェアを記述すると役立ちます。

    Apple TouchPadを使用しているOSX、Qt5、PyQtでは、QGestureOverrideタイプのQEventを受け入れない限り、特定のジェスチャーイベントが到着しなかったことがわかりました。このようなイベントの目的についてのドキュメントは非常に曖昧です。ドキュメンテーションによれば、それはデフォルトでは無視されますが、これは例外的です:他のほとんどのジェスチャーはデフォルトで受け入れられます。つまり、同じジェスチャーのさらなるイベントが発生します。

    ジェスチャーのこの「受け入れ」の意味は、イベントの「受け入れ」の一般的な意味とは異なります。 「受け入れる」とは、ジェスチャーが「さらなるイベントを起こさせる」ことを意味するように見えるが、イベントを「受け入れる」とは、「ウィジェットのチェーンを通じてこのイベントを伝播しない」ことを意味する。また、QGestureを受け入れることとQGestureを受け入れることについてのドキュメントは非常に混乱しています。 QGestureEventは、QGesturesのコンポジットです。 QGestureEventを受け入れることが、含まれているジェスチャーを受け入れることと同じかどうかは、非常に混乱しています。 QGestureにはaccept()メソッドがありません。QGestureEventには、accept()、setAccepted(bool)、setAccepted(gesture、bool)、setAccepted(gestureType、bool)などのいくつかのオーバーロードされた便利メソッドがあります。

    QGestureOverrideタイプのイベントに戻る:Qt.QEvent列挙は、QGestureOverrideタイプのイベントがQGestureEventのサブクラスであることを意味する "Qt.QGestureOverride ...(QGestureEvent)"を表示しますが、そうではありません。ジェスチャー()メソッドをQGestureOverride型のイベントに対して実行します。 (だから、どのような種類のジェスチャーオーバーライドが受け入れられているのかは分かりますか?)そして、イベントを無視するというデフォルトは、それを伝播させるだけではなく、含まれている(ジェスチャー)彼らが何であれ。)

    たとえば、実際の2本指のピンチは、Qchest型のジェスチャーを持つジェスチャーイベントを生成しませんでしたが、タイプQGestureOverrideのQEventを受け入れるまで、タイプPanのジェネレーションを生成しませんでした。その後、ピンチジェスチャーイベントが最初に来て、後でピンチとパンがジェスチャーイベントをします。私がピンチしたとき、またはピンチした後に私が2本の指をスローピーにパンしたとき。 (少なくとも、OSXのトラックパッドでは、デバイスドライバやコントロールパネルで定義されているように、パン(スクロール操作)は2本の指であることに注意してください)

    関連する問題