Drag QML Type

用于指定移动项目的拖放事件。更多

Import Statement: import QtQuick

附加属性

附加信号

附加方法

详细说明

通过使用拖动附加属性,任何项目都可以成为场景中拖放事件的来源。

当对一个项目拖动active 时,该项目位置的任何变化都将产生一个拖动事件,该事件将发送到与该项目新位置相交的任何DropArea 。其他实现拖放事件处理程序的项目也可以接收这些事件。

下面的代码段显示了如何使用MouseArea 拖动项目。不过,拖动并不局限于鼠标拖动;任何可以移动项目的操作都会产生拖动事件,包括触摸事件、动画和绑定。

import QtQuick

Item {
    width: 200; height: 200

    DropArea {
        x: 75; y: 75
        width: 50; height: 50

        Rectangle {
            anchors.fill: parent
            color: "green"

            visible: parent.containsDrag
        }
    }

    Rectangle {
        x: 10; y: 10
        width: 20; height: 20
        color: "red"

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

        MouseArea {
            id: dragArea
            anchors.fill: parent

            drag.target: parent
        }
    }
}

可以通过使用 Drag.cancel() 取消拖动或将 Drag.active 设置为 false 来终止拖动,也可以通过调用 Drag.drop() 终止拖动。如果接受了拖放事件,Drag.drop() 将返回事件接收者选择的drop action ,否则将返回 Qt.IgnoreAction。

另请参阅 Qt Quick 示例 - 拖放

附加属性文档

Drag.active : bool [read-only]

此属性用于保存拖动事件序列当前是否处于活动状态。

将此属性与MouseArea::drag 的 active 属性绑定,将导致在用户开始拖动时调用startDrag

将此属性设置为 true 时,还将向场景发送一个 QDragEnter 事件,其中包含项目的当前位置。设置为 false 则会发送 QDragLeave 事件。

当拖动激活时,项目位置的任何变化都会向场景发送一个包含项目新位置的 QDragMove 事件。


Drag.dragType : enumeration

该属性指示是自动开始拖动、不做任何操作,还是使用向后兼容的内部拖动。默认情况下使用向后兼容的内部拖动。

也可以使用startDrag 手动启动拖动。

常数说明
Drag.None不自动启动拖动
Drag.Automatic自动启动拖动
Drag.Internal(默认)自动启动向后兼容的拖动

使用Drag.Automatic 时,还应定义mimeData ,并将active 属性与MouseArea 的活动属性绑定:MouseArea::drag.active


Drag.hotSpot : point

该属性保存相对于项目左上角的拖动位置。

默认为(0,0)。

对热点的更改会以更新的位置触发新的拖动移动。


Drag.imageSource : url

该属性保存在拖放操作中用于表示数据的图片的 URL。在拖放操作开始后更改此属性将不会有任何效果。

下面的示例使用项目内容作为拖动图像:

import QtQuick

Item {
    width: 200; height: 200

    Rectangle {
        anchors.centerIn: parent
        width: text.implicitWidth + 20; height: text.implicitHeight + 10
        color: "green"
        radius: 5

        Drag.dragType: Drag.Automatic
        Drag.supportedActions: Qt.CopyAction
        Drag.mimeData: {
            "text/plain": "Copied text"
        }

        Text {
            id: text
            anchors.centerIn: parent
            text: "Drag me"
        }

        DragHandler {
            id: dragHandler
            onActiveChanged:
                if (active) {
                    parent.grabToImage(function(result) {
                        parent.Drag.imageSource = result.url
                        parent.Drag.active = true
                    })
                } else {
                    parent.Drag.active = false
                }
        }
    }
}

另请参阅 Item::grabToImage()。


Drag.imageSourceSize : size [since 6.8]

此属性保存拖放操作中用于表示数据的图像大小。在拖放操作开始后更改此属性不会有任何影响。

该属性设置了已加载图像的最大存储像素数,因此大图像不会占用超过必要的内存。更多详情,请参阅Image.sourceSize

下面的示例显示了以一种尺寸渲染的 SVG 图像,并为拖动图像重新渲染了不同尺寸:

import QtQuick

Item {
    width: 200; height: 200

    Image {
        anchors.centerIn: parent
        source: "images/qt_logo.svg"
        sourceSize.width: 96

        Drag.dragType: Drag.Automatic
        Drag.supportedActions: Qt.CopyAction
        Drag.mimeData: {
            "text/plain": "Qt Quick rocks!"
        }
        Drag.imageSource: "images/qt_logo.svg"
        Drag.imageSourceSize: Qt.size(48, 35)
        Drag.active: dragHandler.active

        DragHandler {
            id: dragHandler
        }
    }
}

此属性在 Qt 6.8 中引入。

另请参阅 imageSourceItem::grabToImage()。


Drag.keys : stringlist

该属性包含一个键值列表,可用于DropArea 过滤拖动事件。

在拖动激活时更改键值将重置拖动事件的顺序,即发送一个拖动离开事件,然后再发送一个带有新源的拖动进入事件。


Drag.mimeData : var

该属性保存从 mime 类型到数据的映射,在startDrag 时使用。mime 数据的类型必须与 mime 类型相匹配(例如,如果 mime 类型为 "text/plain",则为字符串;如果 mime 类型为 "image/png",则为图像),或者是根据 mime 类型对数据进行编码的ArrayBuffer


Drag.proposedAction : enumeration

drop() 的返回值。

对 proposedAction 的更改将触发一个包含更新建议的移动事件。


Drag.source : Object

此属性包含一个对象,拖动事件的接收者会将此对象识别为事件源。默认情况下,该对象就是拖动属性所连接的项目。

在拖动激活时更改源将重置拖动事件的顺序,即发送一个拖动离开事件,然后再发送一个带有新源的拖动进入事件。


Drag.supportedActions : flags

drop() 的返回值。

在拖动处于活动状态时更改 supportedActions 将重置拖动事件的顺序,方法是先发送一个拖动离开事件,然后再发送一个带有新源的拖动进入事件。


Drag.target : Object

当拖动处于活动状态时,该属性将保留最后一个接受来自拖动项的输入事件的对象,如果当前拖动位置没有与任何接受目标相交,则该属性为空。

当拖动未激活时,该属性将保存接受结束拖动的下拉事件的对象,如果没有对象接受下拉或拖动被取消,则目标将为空。


附加信号文档

dragFinished(DropAction dropAction)

当拖动结束,且拖动是使用startDrag() 方法启动或使用dragType 属性自动启动时,将发出此信号。

dropAction 该信号包含目标项目接受的操作。

注: 相应的处理程序是onDragFinished

另请参阅 drop() 。


dragStarted()

当使用startDrag() 方法启动拖动或使用dragType 属性自动启动拖动时,将发出此信号。

注: 相应的处理程序是onDragStarted


附加方法文档

void cancel()

结束拖动序列。


enumeration drop()

通过向目标项目发送下拉事件来结束拖动序列。

返回目标项接受的操作。如果目标项目或父项目不接受下拉事件,则将返回 Qt.IgnoreAction。

返回的下拉动作可以是

常量说明
Qt.CopyAction将数据复制到目标
Qt.MoveAction将数据从源移动到目标
Qt.LinkAction创建从源到目标的链接。
Qt.IgnoreAction忽略操作(不对数据做任何操作)。

void start(flags supportedActions)

开始发送拖动事件。用于启动旧式内部拖动。startDrag 是启动拖动的新式首选方法。

可选的supportedActions 参数可用于覆盖已启动序列的supportedActions 属性。


void startDrag(flags supportedActions)

开始发送拖动事件。

可选的supportedActions 参数可用于覆盖已启动序列的supportedActions 属性。


© 2025 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.