このページでは

QML 動的ビュー順序設定チュートリアル 2 - ビュー項目のドラッグ

アイテムのリストが表示されたので、次はそれらとインタラクションできるようにします。まず、表示されているコンテンツを画面上で上下にドラッグできるように、デリゲートを拡張することから始めます。更新後のデリゲートは次のようになります:

    Component {
        id: dragDelegate

        MouseArea {
            id: dragArea

            property bool held: false
            required property string name
            required property string type
            required property string size
            required property int age

            anchors {
                left: parent?.left
                right: parent?.right
            }
            height: content.height

            drag.target: held ? content : undefined
            drag.axis: Drag.YAxis

            onPressAndHold: held = true
            onReleased: held = false

            Rectangle {
                id: content
                anchors {
                    horizontalCenter: parent.horizontalCenter
                    verticalCenter: parent.verticalCenter
                }
                width: dragArea.width
                height: column.implicitHeight + 4

                border.width: 1
                border.color: "lightsteelblue"
                color: dragArea.held ? "lightsteelblue" : "white"
                Behavior on color { ColorAnimation { duration: 100 } }
                radius: 2
                states: State {
                    when: dragArea.held

                    ParentChange {
                        target: content
                        parent: root
                    }
                    AnchorChanges {
                        target: content
                        anchors {
                            horizontalCenter: undefined
                            verticalCenter: undefined
                        }
                    }
                }
                Column {
                    id: column
                    anchors {
                        fill: parent
                        margins: 2
                    }

                    Text { text: qsTr('Name: ') + dragArea.name }
                    Text { text: qsTr('Type: ') + dragArea.type }
                    Text { text: qsTr('Age: ') + dragArea.age }
                    Text { text: qsTr('Size: ') + dragArea.size }
                }
            }
        }
    }
手順

ここでの主な変更点は、デリゲートのルートアイテムがMouseArea になったことです。これはマウスイベント用のハンドラを提供し、デリゲートのコンテンツアイテムをドラッグできるようにします。また、コンテンツアイテムのコンテナとしても機能します。これは、デリゲートのルートアイテムはビューによって位置決めされ、他の手段では移動できないため、重要な点です。

        MouseArea {
            id: dragArea

            property bool held: false
            required property string name
            required property string type
            required property string size
            required property int age

            anchors {
                left: parent?.left
                right: parent?.right
            }
            height: content.height

            drag.target: held ? content : undefined
            drag.axis: Drag.YAxis

            onPressAndHold: held = true
            onReleased: held = false

            Rectangle {
                id: content
            }
        }

コンテンツ項目のドラッグを有効にするには、それをMouseArea のdrag.target プロパティにバインドします。ビューのフリック操作は引き続き可能にしたいので、MouseArea のpressAndHold シグナルが発信されるまで待機してから、ドラッグターゲットをバインドします。こうすることで、ホールドタイムアウトが切れる前にマウスが動いた場合はリストの移動と解釈され、タイムアウト後に動いた場合は項目のドラッグと解釈されます。 アイテムがドラッグ可能になったことをユーザーにより明確に伝えるため、タイムアウトが切れた際にコンテンツアイテムの背景色を変更します。

                color: dragArea.held ? "lightsteelblue" : "white"
                Behavior on color { ColorAnimation { duration: 100 } }

また、アイテムをドラッグ可能にする前に、コンテンツアイテム上のアンカーをすべて解除し、自由に移動できるようにする必要があります。 これは、デリゲートアイテムがホールドされたときにトリガーされる状態変更内で実行します。同時に、コンテンツアイテムをルートアイテムの子として再設定することで、スタック順で他のアイテムより上になり、ドラッグ中に隠れてしまうのを防ぎます。

                states: State {
                    when: dragArea.held

                    ParentChange {
                        target: content
                        parent: root
                    }
                    AnchorChanges {
                        target: content
                        anchors {
                            horizontalCenter: undefined
                            verticalCenter: undefined
                        }
                    }
                }

サンプルプロジェクト @ code.qt.io

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.