QML 拖动键不匹配



(Windows上的QtQuick 2.12(

我试图拖动一些不可见的东西,并利用我正在拖动的DropArea中的keys属性和Item中的Drag.keys属性。如果DropArea有一个空键,它就会生成事件,但如果我在其中放入任何东西,它根本不会响应,即使拖动的Item有匹配的键。

这是Mybutton.qml:

import QtQuick 2.12
Rectangle {
height:                 100
width:                  100
color:                  "white"
property var keys:      []
DropArea {
anchors.fill:           parent
keys:                   parent.keys
onEntered:              console.log("entered", keys)
onExited:               console.log("exited", keys)
onDropped:              console.log("dropped", keys)
}
MouseArea {
id:                     mouse
anchors.fill:           parent
drag.target:            message
onPressed: {
message.x = parent.x + mouse.x
message.y = parent.y + mouse.y
message.keys = parent.keys
message.Drag.active = Qt.binding(
function() { return drag.active })
}
}
}

这是main.qml:

import QtQuick 2.12
import QtQuick.Window 2.12
Window {
visible:    true
width:      400
height:     400
title:      qsTr("TestDrag")
color:      "black"
Item {
id:                     message
width:                  1
height:                 1
property var keys:      []
Drag.keys:              keys
Drag.dragType:          Drag.Automatic
Drag.onDragStarted:     console.log("started", Drag.keys)
Drag.onDragFinished:    console.log("finished", dropAction)
onXChanged:             console.log(x, y)
}
MyButton { x: 50;  y: 50;  keys: [ "top", "left" ] }
MyButton { x: 250; y: 50;  keys: [ "top", "right" ] }
MyButton { x: 50;  y: 250; keys: [ "bottom", "left" ] }
MyButton { x: 250; y: 250; keys: [ "bottom", "right" ] }
}

这会产生四个正方形,我应该能够将任何一个拖动到相邻的正方形上,但不能拖动到对面的角上,因为它不共享任何关键点。但我不能把任何事情拖到任何事情上。如果我注释掉其中一个按钮上的键,那么我显然可以把其他任何一个放在上面,证明看不见的Item实际上被拖到了我认为的地方。

文件很不清楚,所以我想我可能做错了什么。但是什么?

或者,如果我不想拖动实际的视觉项目,有没有更简单的拖放方法?我只想让光标根据它是否在可以放下的东西上而改变形状。

对于后面的接口Drag.AutomaticstartDrag(),请使用Drag.mimeData而不是Drag.keys

如果你不想拖动来移动任何东西,你可以使用以下项目:

MouseArea{ 
Drag.mimeData: { 'someKey': '' }   
onPressed:     { Drag.active = true;   Drag.startDrag(); }
}
DropArea{ keys: ['someKey'] }

也被这件事难住了,通过使用real的答案,意识到在这种情况下"someKey"是DropArea使用的密钥,如果需要,仍然可以向拖动操作添加额外的数据,比如:

MouseArea{ 
Drag.dragType: Drag.Automatic
Drag.mimeData: { 
'someKey': '',
'text/plain': "test_string" 
}   
onPressed:     { Drag.active = true;   Drag.startDrag(); }
}
DropArea{ 
keys: 'someKey'
onDropped: {
if (drop.hasText) {
console.log("Drop Keys: " + drop.keys)
console.log("Drop Text: " + drop.text)
}
}
}

输出:

Drop Keys: someKey,text/plain
Drop Text: test_string

相关内容

  • 没有找到相关文章

最新更新