QtQuick.qtquick-draganddrop-example

src="https://assets.ubuntu.com/v1/6a8e5b22-qml-draganddrop-example.png" alt="" />

Drag and Drop is a collection of small QML examples relating to drag and drop functionality. For more information, visit the Drag and Drop page.

Running the Example

To run the example from Qt Creator, open the Welcome mode and select the example from Examples. For more information, visit Building and Running an Example.

Tiles

Tiles adds drag and drop to simple rectangles, which you can drag into a specific grid.

It has a DragTile component which uses a MouseArea to move an item when dragged:

Item {
id: root
property string colorKey
width: 64; height: 64
MouseArea {
id: mouseArea
width: 64; height: 64
anchors.centerIn: parent
drag.target: tile
onReleased: parent = tile.Drag.target !== null ? tile.Drag.target : root
Rectangle {
id: tile
width: 64; height: 64
anchors.verticalCenter: parent.verticalCenter
anchors.horizontalCenter: parent.horizontalCenter
color: colorKey
Drag.keys: [ colorKey ]
Drag.active: mouseArea.drag.active
Drag.hotSpot.x: 32
Drag.hotSpot.y: 32
states: State {
when: mouseArea.drag.active
ParentChange { target: tile; parent: root }
AnchorChanges { target: tile; anchors.verticalCenter: undefined; anchors.horizontalCenter: undefined }
}
}
}
}

And a DropTile component which the dragged tiles can be dropped onto:

DropArea {
id: dragTarget
property string colorKey
property alias dropProxy: dragTarget
width: 64; height: 64
keys: [ colorKey ]
Rectangle {
id: dropRectangle
anchors.fill: parent
color: colorKey
states: [
State {
when: dragTarget.containsDrag
PropertyChanges {
target: dropRectangle
color: "grey"
}
}
]
}
}

The keys property of the DropArea will only allow an item with a matching key in its Drag.keys property to be dropped on it.

GridView

GridView adds drag and drop to a GridView, allowing you to reorder the list. It also uses a DelegateModel to move a delegate item to the position of another item it is dragged over.

    model: DelegateModel {
delegate: MouseArea {
id: delegateRoot
property int visualIndex: DelegateModel.itemsIndex
width: 80; height: 80
drag.target: icon
Rectangle {
id: icon
width: 72; height: 72
anchors {
horizontalCenter: parent.horizontalCenter;
verticalCenter: parent.verticalCenter
}
color: model.color
radius: 3
Drag.active: delegateRoot.drag.active
Drag.source: delegateRoot
Drag.hotSpot.x: 36
Drag.hotSpot.y: 36
states: [
State {
when: icon.Drag.active
ParentChange {
target: icon
parent: root
}
AnchorChanges {
target: icon;
anchors.horizontalCenter: undefined;
anchors.verticalCenter: undefined
}
}
]
}
DropArea {
anchors { fill: parent; margins: 15 }
onEntered: visualModel.items.move(drag.source.visualIndex, delegateRoot.visualIndex)
}
}

Files:

  • draganddrop/draganddrop.qml
  • draganddrop/tiles/DragTile.qml
  • draganddrop/tiles/DropTile.qml
  • draganddrop/tiles/tiles.qml
  • draganddrop/views/gridview.qml
  • draganddrop/main.cpp
  • draganddrop/draganddrop.pro
  • draganddrop/draganddrop.qmlproject
  • draganddrop/draganddrop.qrc