2013-01-14 11 views
9

Próbowałem "Przykład Gestów obrazów" z http://doc.qt.digia.com/4.6/gestures-imagegestures.html. W tym przykładzie masz tylko 3 gesty: PanGesture, PinchGesture i SwipeGesture. Ale Qt oferuje 5 gestówQt, Gesty. TapAndHold i Swipe nie są rozpoznawane

  • TapGesture
  • TapAndHoldGesture
  • PanGesture
  • PinchGesture
  • SwipeGesture

W celu rozpoznania wszystkie 5 gesty musimy napisać do ImageWidget-Konstruktora :

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

dodałem metodę GestureEvent() Również

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; 
} 

i zapisu metody brakujące jak

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

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

więc moje pytanie brzmi, dlaczego gesty Swipe i TapAndHold nie są rozpoznawane? Gesty te są również realizowane w postaci trzech rozpoznawanych gestów (Pan, Pinch i Tap). Dlaczego to nie działa?

Dziękuję z góry za pomocą

+0

Zrozumiałeś to? Próbuję również zrozumieć przechwytywanie gestów w QListWidget. –

+0

Rozwiązałeś to? Mam także ten sam problem. – Tarantula

Odpowiedz

0

Spróbuj nowszą wersję Qt (i nie wspominając systemu operacyjnego lub urządzenia). Nie wiem, że nowsza wersja będzie lepsza, ale Wiem, że około rok temu cały stos (zdarzenia X11, sterowniki urządzeń, obsługa systemu operacyjnego itp.) Był w ciągłym ruchu i niekompletny. Na przykład, jak pamiętam, w tym czasie próbowałem, tylko gesty w Qt na Windows działały, a Linux/Ubuntu (z Canonical) był w toku.

2

Jeszcze raz pomogłoby Ci opisanie platformy i sprzętu dotykowego.

Na OSX, Qt5, PyQt, przy użyciu tabletu Apple TouchPad, stwierdziłem, że pewne gesty nie dotarły, chyba że zaakceptujesz QEvent typu QGestureOverride. Dokumentacja jest bardzo rozmyta na temat celu takiego wydarzenia. Dokumentacja mówi, że jest domyślnie ignorowana, co jest wyjątkowe: większość innych gestów jest domyślnie akceptowana, co oznacza, że ​​nadejdą kolejne zdarzenia związane z tym samym gestem.

To znaczenie "akceptuj" dla gestów różni się od ogólnego znaczenia "akceptuj" dla zdarzeń. "Zaakceptuj" gest wydaje się oznaczać "pozwól na dalsze zdarzenia", a "zaakceptuj" wydarzenie oznacza "nie propaguj tego zdarzenia przez łańcuch widżetów". Ponadto, dokumenty są bardzo mylące w kwestii akceptacji QGestureEvent w porównaniu z akceptacją QGesture. QGestureEvent jest połączeniem QGestures. To bardzo mylące, czy przyjęcie QGestureEvent jest tym samym, co przyjęcie zawartych gestów. Zauważ, że QGesture nie ma metody accept(), a QGestureEvent ma kilka przeciążonych i wygodnych metod: accept(), setAccepted (bool), setAccepted (gest, bool), setAccepted (gestureType, bool), itp.

Powrót do QEvent typu QGestureOverride: wyliczenie Qt.QEvent pokazuje "Qt.QGestureOverride ... (QGestureEvent)" co oznacza dla mnie wydarzenie typu QGestureOverride jest podklasą QGestureEvent, ale nie jest: nie ma gestów() metoda na zdarzenie typu QGestureOverride. (Więc skąd wiadomo, jaki rodzaj akceptacji gestów akceptujesz?) I wydaje się, że domyślnie ignorowanie zdarzenia nie jest tylko zezwoleniem na propagowanie, ale zapobieganie kolejnym zdarzeniom dotyczącym zawartych (sic) gestów (czymkolwiek oni są.)

Na przykład w niektórych testach prawdziwy szczypiec z dwoma palcami nigdy nie generował żadnych gestów mających gest typu Pinch, ale generował typ Pan, dopóki nie przyjąłem QEvent typu QGestureOverride. Następnie pojawiły się zdarzenia związane z gestem uszczypnięcia, a później zdarzenia związane z gestami Szczypta i Pan, gdy nieudolnie przesunąłem dwoma palcami, gdy się ściskałem, lub po tym, jak uszczypnęłam. (Uwaga co najmniej na OSX TrackPad, Pan (operacja przewijania) jest z dwoma palcami, jak zdefiniowano przez sterownik urządzenia lub panel sterowania dla tego samego?)

Powiązane problemy