2015-03-24 13 views
5

Tôi đang triển khai trình thu nhận cử chỉ (vuốt sang trái/phải) bằng MouseArea. Nó sẽ hoạt động bên trong Flickable với flickableDirection dọc. Ngoài ra, nó sẽ truyền bá các sự kiện chuột đến các phần tử khác bên dưới nó theo thứ tự hình ảnh. Vấn đề là mouseArea con với propagateComposedEvents đặt thành true là chặn bất kỳ cảnh cáo nào của cha mẹ trước chính xác một cú nhấp chuột được thực hiện. Sau khi nhấp chuột đầu tiên được thực hiện nó hoạt động chính xác. Đây là mã đơn giản được hiển thị này.MouseArea bên trong Flickable đang ngăn không cho nó nhấp nháy

import QtQuick 2.4 
import QtQuick.Window 2.2 

Window { 
    id: __root 
    visible: true 
    width: 460; height: 640 

    Flickable { 
     id: mainFlickable 

     width: parent.width 
     height: parent.height 
     contentHeight: column.height 
     flickableDirection: Flickable.VerticalFlick 

     MouseArea { 
      anchors.fill: parent 
      propagateComposedEvents: true 
      z: 1 
     } 

     Column { 
      id: column 

      width: parent.width 

      Repeater { 
       model: 5 

       Rectangle { 
        width: __root.width 
        height: 200 

        color: "yellow" 
        border.width: 2 

        MouseArea { 
         anchors.fill: parent 

         onClicked: { 
          console.log("clicked") 
         } 
        } 
       } 
      } //repeater 
     } //column 
    } //flickable 
} //window 

Tôi đã dành khá nhiều thời gian để sửa lỗi này và sẽ đánh giá cao bất kỳ trợ giúp nào. Cảm ơn trước!

+1

+1 cho mã hoạt động: đó là trình tiết kiệm thời gian! Đối với vấn đề, nó có mùi giống như một lỗi đối với tôi. Các sự kiện 'Đã nhấn' được * tự động * chấp nhận và đó là những gì xảy ra lần đầu tiên, tức là' MouseArea' bên ngoài sẽ ăn mòn sự kiện. Sau đó, điều khiển 'Flickable' có thể kiểm soát. Có vẻ như 'Flickable' cần một "ấm lên". Không chắc chắn nếu tập trung có thể giúp đỡ. Có thể giải pháp, hy vọng nó không phá vỡ trường hợp sử dụng của bạn, là việc bổ sung 'onPressed: mouse.accepted = false' vào bên ngoài' MouseArea' để luôn truyền bá các sự kiện 'ép'. – BaCaRoZzo

+0

Cảm ơn câu trả lời của bạn! Mặc dù Flickable làm việc với workaround này, nó sẽ phá vỡ mã của tôi, bởi vì tôi sẽ không nhận được tín hiệu 'positionChanged' và' release' nếu con chuột bị từ chối trên báo chí. Tôi đã cố gắng để từ chối nó chỉ khi một số khoảng cách được thực hiện trên XAxis (trong onPositionsChanged) nhưng nó không hoạt động ở đó. Ngoài ra, tập trung không phải là giúp đỡ. – rsht

+0

Tập trung là một cơn đau ở cổ. Tôi cũng đang cố gắng sử dụng nó. Uhm ... bạn không thể sử dụng 'drag' +' MouseX' để chặn các swipes? – BaCaRoZzo

Trả lời

4

tôi thấy rằng sau xử lý tín hiệu trong MouseArea là một workaround cho điều này và không phá vỡ mã của tôi:

onReleased: { 
    if (!propagateComposedEvents) { 
     propagateComposedEvents = true 
    } 
} 

propagateComposedEvents nên được đặt thành false trên tờ khai (hoặc được yêu cầu).

Cảm ơn tất cả vì những nỗ lực!

0

Tôi đã tìm thấy một chút giải pháp cho việc này. Hy vọng nó sẽ phù hợp với nhu cầu của bạn (ít nhất là cho đến khi giải pháp tốt hơn sẽ được cung cấp).

Đây là mã cập nhật của bạn:

import QtQuick 2.4 
import QtQuick.Window 2.2 

Window { 
    id: __root 
    visible: true 
    width: 460; height: 640 

    Flickable { 
     id: mainFlickable 

     width: parent.width 
     height: parent.height 
     contentHeight: column.height 
     flickableDirection: Flickable.VerticalFlick 

     onDragStarted: ma.enabled = false 
     onDragEnded: ma.enabled = true 

     MouseArea { 
      id: ma 
      anchors.fill: parent 
      enabled: false 
      propagateComposedEvents: true 
      z: 100 

      onClicked: { 
       print("CLICKED ON UPPER") 
       mouse.accepted = false 
      } 
     } 

     Column { 
      id: column 

      width: parent.width 

      Repeater { 
       model: 5 

       Rectangle { 
        width: __root.width 
        height: 200 

        color: "yellow" 
        border.width: 2 

        MouseArea { 
         anchors.fill: parent     
         onClicked: console.log("clicked on child") 
        } 
       } 
      } //repeater 
     } //column 
    } //flickable 
} //window 
+1

'mouse.accepted = false' Là một giải pháp thay thế nhưng sẽ phá vỡ logic của tôi vì nó sẽ chặn các tín hiệu' positionChanged' và 'release' trong tương lai. Cảm ơn nhiều vì câu trả lời tho. – rsht

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