2013-01-14 35 views
9

Tôi đã thử một "Ví dụ về cử chỉ hình ảnh" từ http://doc.qt.digia.com/4.6/gestures-imagegestures.html. Trong ví dụ này bạn chỉ có 3 cử chỉ: PanGesture, PinchGesture và SwipeGesture. Nhưng Qt cung cấp 5 Gestures:Qt, Cử chỉ. TapAndHold và Vuốt không được nhận dạng

  • TapGesture
  • TapAndHoldGesture
  • PanGesture
  • PinchGesture
  • SwipeGesture

Để nhận ra tất cả 5 cử chỉ chúng ta cần phải viết vào ImageWidget-Constructor :

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

tôi thêm một phương thức gestureEvent() cũng

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

và viết phương pháp thiếu như

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

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

vậy, câu hỏi của tôi là, tại sao những cử chỉ vuốt và TapAndHold không được công nhận? Những cử chỉ này được thực hiện như nhau như ba cử chỉ được nhận dạng (Pan, Pinch và Tap). Tại sao nó không hoạt động?

Tôi cảm ơn bạn trước cho sự giúp đỡ

+0

Bạn đã tính toán điều này chưa? Tôi cũng đang cố gắng hiểu cử chỉ chụp trong một QListWidget. –

+0

Bạn đã giải quyết vấn đề này chưa? Tôi cũng phải đối mặt với cùng một vấn đề. – Tarantula

Trả lời

0

Hãy thử một phiên bản mới hơn của Qt (và bạn không đề cập OS hoặc thiết bị của bạn.) Tôi không biết rằng một phiên bản mới hơn sẽ tốt hơn, nhưng Tôi biết rằng khoảng một năm trước đây, toàn bộ ngăn xếp (các sự kiện X11, trình điều khiển thiết bị, hỗ trợ hệ điều hành, vv) là thông lượng và không đầy đủ. Ví dụ, khi tôi nhớ lại, tại thời điểm tôi đã thử, chỉ có cử chỉ trong Qt trên Windows làm việc, và Linux/Ubuntu (từ Canonical) đang được tiến hành.

2

Một lần nữa, nó sẽ giúp ích nếu bạn mô tả nền tảng của mình và chạm vào phần cứng.

Trên OSX, Qt5, PyQt, sử dụng Apple TouchPad, tôi thấy rằng một số sự kiện cử chỉ đã không đến trừ khi bạn chấp nhận QEvent loại QGestureOverride. Tài liệu này rất mờ về mục đích của một sự kiện như vậy. Các tài liệu nói rằng đó là bị bỏ qua theo mặc định, đó là đặc biệt: hầu hết các cử chỉ khác được chấp nhận theo mặc định, có nghĩa là các sự kiện tiếp theo cho cùng một cử chỉ sẽ đến.

Ý nghĩa "chấp nhận" cho cử chỉ này khác với ý nghĩa chung của "chấp nhận" cho các sự kiện. "Chấp nhận" một cử chỉ dường như có nghĩa là "để cho các sự kiện tiếp theo đến" trong khi "chấp nhận" một sự kiện có nghĩa là "không tuyên truyền sự kiện này thông qua chuỗi các tiện ích". Ngoài ra, các tài liệu rất khó hiểu về việc chấp nhận một QGestureEvent so với việc chấp nhận một QGesture. QGestureEvent là một hỗn hợp của QGestures. Nó rất khó hiểu cho dù chấp nhận một QGestureEvent là giống như chấp nhận các cử chỉ chứa. Lưu ý rằng QGesture không có phương thức accept() và QGestureEvent có một số phương thức quá tải và tiện lợi: accept(), setAccepted (bool), setAccepted (gesture, bool), setAccepted (gestureType, bool), v.v.

Quay lại QEvent kiểu QGestureOverride: kiểu liệt kê Qt.QEvent hiển thị "Qt.QGestureOverride ... (QGestureEvent)" mà với tôi nghĩa là một sự kiện kiểu QGestureOverride là một phân lớp của QGestureEvent, nhưng nó không phải là: không có cử chỉ() trên một sự kiện kiểu QGestureOverride. Và có vẻ như trường hợp mặc định bỏ qua sự kiện không chỉ cho phép nó truyền bá, mà còn ngăn chặn các sự kiện tiếp theo cho các cử chỉ chứa (sic) (bất kể chúng là gì.Ví dụ, trong một số thử nghiệm của tôi, một pinch hai ngón tay thực sự không bao giờ tạo ra bất kỳ sự kiện cử chỉ nào có cử chỉ kiểu Pinch, nhưng đã tạo kiểu Pan, cho đến khi tôi chấp nhận QEvent kiểu QGestureOverride. Sau đó, các sự kiện cử chỉ Pinch đến trước, và sau đó cả hai sự kiện cử chỉ Pinch và Pan, khi tôi sloppily panned hai ngón tay của tôi như tôi bị chèn ép, hoặc sau khi tôi bị chèn ép. (Lưu ý ít nhất trên OSX TrackPad, một Pan (thao tác cuộn) bằng hai ngón tay, như được định nghĩa bởi trình điều khiển thiết bị hoặc bảng điều khiển cho cùng?)

Các vấn đề liên quan