2016-06-28 8 views
2

DropAreaと2つの要素があります。 DropAreaは、DropAreaがすでに1つの要素を落としてしまった場合にドロップイベントを拒否したい、もう1つの要素が落ちることができないようにしたい。QML:ドロップアクションを拒否する方法

DropArea { 
    property bool dropped: false 

    onDropped: { 
     drop.accepted = !dropped; 
     dropped = true; 
    } 
    onExited: dropped = false 
} 

しかし、オブジェクトを取得するには、とにかくところでdrop.acceptedが動作しないように、見え ではなくDropArea

+0

Qtのバージョンは何? – BaCaRoZzo

答えて

2

項目がdroppedプロパティをチェックし、onReleasedに落としたりしないようにする必要があり場合は、制御する必要があります。

全例:

import QtQuick 2.5 
import QtQuick.Window 2.2 
import QtQuick.Controls 1.4 

Window { 
    id: win 
    visible: true 
    width: 800 
    height: 600 
    title: qsTr("Hello World") 

    Repeater { 
     model: 10 
     Rectangle { 
      id: rect 
      width: 50 
      height: 50 
      z: mouseArea.drag.active || mouseArea.pressed ? 2 : 1 
      color: Qt.rgba(Math.random(), Math.random(), Math.random(), 1) 
      x: Math.random() * (win.width/2 - 100) 
      y: Math.random() * (win.height - 100) 
      property point beginDrag 
      property bool caught: false 
      border { width:2; color: "white" } 
      radius: 5 
      Drag.active: mouseArea.drag.active 

      Text { 
       anchors.centerIn: parent 
       text: index 
       color: "white" 
      } 
      MouseArea { 
       id: mouseArea 
       anchors.fill: parent 
       drag.target: parent 
       onPressed: { 
        rect.beginDrag = Qt.point(rect.x, rect.y); 
       } 
       onReleased: { 
        if(!rect.caught || dragTarget.dropped) { 
         backAnimX.from = rect.x; 
         backAnimX.to = beginDrag.x; 
         backAnimY.from = rect.y; 
         backAnimY.to = beginDrag.y; 
         backAnim.start() 
        } 

        parent.Drag.drop() 

        console.log("MouseArea - containsDrag " + dragTarget.dropped) 
       } 

      } 
      ParallelAnimation { 
       id: backAnim 
       SpringAnimation { id: backAnimX; target: rect; property: "x"; 
            duration: 500; spring: 2; damping: 0.2 } 
       SpringAnimation { id: backAnimY; target: rect; property: "y"; 
            duration: 500; spring: 2; damping: 0.2 } 
      } 
     } 
    } 

    Rectangle { 
     anchors { 
      top: parent.top 
      right: parent.right 
      bottom: parent.bottom 
     } 
     width: parent.width/2 
     color: "gold" 
     DropArea { 
      id: dragTarget 
      anchors.fill: parent 

      property bool dropped: false 

      onEntered: { 
       console.log("onEntered " + containsDrag) 
       drag.source.caught = true; 
      } 
      onExited: { 
       console.log("onExited " + containsDrag) 
       dropped = false; 
      } 
      onDropped: 
      { 
       console.log("onDropped"); 
       dropped = true; 
      } 
     } 
    } 
} 
1

使用drop.accept()に滴下しました。以下のように行うことができます。

property bool containsItem: false 
DropArea { 
    id: dropArea 
    anchors.fill: parent 
    onDropped: { 
     if(containsItem) 
      drop.accept(Qt.IgnoreAction) 
     else 
      drop.accept() 

     containsItem = true; 
    } 
} 

はまた、それがすでにonDroppedイベントハンドラ内の添付プロパティであるようdroppedプロパティを使用scroll down toパソコンへ転送。

編集: rectがある場合に項目をドラッグしてからドロップされる:

Rectangle { 
    id: rect 
    width: 40; height: 40 
    color: "red" 

    Drag.active: dragArea.drag.active 
    Drag.hotSpot.x: 20 
    Drag.hotSpot.y: 20 

    MouseArea { 
     id: dragArea 
     anchors.fill: parent 
     drag.target: parent 
     onReleased: if (rect.Drag.drop() !== Qt.IgnoreAction) { 
         console.log("Accepted!"); 
        } else { 
         console.log("Rejected!"); 
        } 
    } 
} 
+0

ありがとうございますが、 'drop.accept(Qt.IgnoreAction)'はまだ動作しません。 Like: 'onDropped:{ drop.accept(Qt.IgnoreAction) }' – Jiu

+1

ignoreまたはacceptアクションは、ドラッグされたアイテムの 'MouseArea'の' onReleased'ハンドラ内で処理できます – astre

関連する問題