我试图了解如何使用QML的drag-and-drop
功能。因此,我修改了Drag QML Type文档中的第一个示例,如下所示:
import QtQuick 2.15
import QtQuick.Window 2.15
Window {
width: 400
height: 400
visible: true
Item {
anchors.fill: parent
DropArea {
x: 100; y: 100; width: 100; height: 100
onEntered: console.log("entered")
onExited: console.log("exited")
onPositionChanged: console.log("dragged to (" + drag.x + ", "
+ drag.y + ")")
onDropped: console.log("dropped")
Rectangle {
anchors.fill: parent
color: parent.containsDrag ? "green" : "yellow"
}
}
Rectangle {
x: 10; y: 10; width: 50; height: 50
color: "red"
Drag.active: dragArea.drag.active
Drag.hotSpot.x: 25
Drag.hotSpot.y: 25
MouseArea {
id: dragArea
anchors.fill: parent
drag.target: parent
}
}
}
}
因此,当我将红色矩形拖放到放置区域上时,我希望dropped
被记录在控制台中。相反,我得到exited
:
qml: entered
qml: dragged to (2, 1)
qml: dragged to (3, 2)
qml: dragged to (5, 3)
qml: dragged to (5, 4)
...
qml: dragged to (44, 39)
qml: dragged to (45, 40)
qml: dragged to (46, 40)
qml: exited <- Shouldn't this be 'dropped'
类似的问题,例如:
DropArea doesn't notify about actions onEntered, onExited, onDropped
没有为所描述的问题提供解决方案。
如何使这项工作按预期进行?
答案 0 :(得分:3)
问题出在下面一行:
Drag.active: dragArea.drag.active
来自关于 Drag.active 属性的文档:
<块引用>将此属性设置为 true 也会发送一个 QDragEnter 事件到 具有项目当前位置的场景。将其设置为 false 将发送 一个 QDragLeave 事件。
因此,当您释放鼠标按钮时,MouseArea 会将 drag.active 属性更改为 false,并且您会收到退出信号。尝试添加到您的鼠标区域:onReleased: parent.Drag.drop()
我想说 Qt 在 Qml 拖放方面有不好的例子。