【发布时间】:2014-08-23 07:33:45
【问题描述】:
我尝试使用新的 QML 类型 Drag、DragEvent 和 DropArea 在 Qt 5.3 中实现拖放。这是来自documentation of the QML Drag type 的原始示例,稍作修改:
import QtQuick 2.2
Item {
width: 800; height: 600
DropArea {
width: 100; height: 100; anchors.centerIn: parent
Rectangle {
anchors.fill: parent
color: parent.containsDrag ? "red" : "green"
}
onEntered: print("entered");
onExited: print("exited");
onDropped: print("dropped");
}
Rectangle {
x: 15; y: 15; width: 30; height: 30; color: "blue"
Drag.active: dragArea.drag.active
// Drag.dragType: Drag.Automatic
Drag.onDragStarted: print("drag started");
Drag.onDragFinished: print("drag finished");
MouseArea {
id: dragArea
anchors.fill: parent
drag.target: parent
}
}
}
预期行为:可以用鼠标拖动蓝色小矩形(拖动目标)。如果拖动到窗口中心较大的绿色矩形上,该矩形会在离开时变为红色并变回绿色。此外,信号dragStarted、entered、exited、dropped和dragFinished是及时发出,相应的信号处理程序打印出它们的消息。
经验丰富的行为:
取决于Drag.dragType(见上面的注释行):
-
Drag.dragType未设置(默认为Drag.Internal):拖放操作如前所述,但仅发出 entered 和 exited 信号。其他信号(dragStarted、dragFinished 和 dropped)被抑制。所以没有办法对
DropArea的下降做出反应。 -
Drag.dragType设置为Drag.Automatic:现在所有信号都发出了,但是蓝色矩形(拖动目标)没有随着鼠标移动。相反,鼠标光标会改变其形状以可视化可能的放置目标。释放鼠标后,蓝色矩形会跳转到最新的鼠标位置。
这两种变体都不令人愉悦。我怎样才能获得所有信号并且仍然能够在拖动目标周围拖动?不幸的是,文档对 QML 中的拖放操作一无所知,尤其是关于不祥的 Drag.dragType。
【问题讨论】:
标签: qt drag-and-drop qml qt5 qt-quick