Qt Qml-如何停止矩形在其外部拖动';父母

Qt Qml-如何停止矩形在其外部拖动';父母,qt,drag-and-drop,qml,Qt,Drag And Drop,Qml,我正在使用qml创建一个可调整大小的矩形,该矩形可以在其父窗格内部拖动,但不能在外部拖动(图1)。当我调整它的大小时,例如使用左上角的手柄,它工作得很好,不能在其父级之外调整大小(图2)。但是当我拖动整个矩形时,它可以被拖动到其父矩形之外(图3)。我的代码尝试对这两个都使用相同的逻辑,即矩形的左侧到达父节点的左侧后,它将取消拖动。可以调整大小,但拖动矩形时不行。我做错了什么 窗格{ id:compPane 隐含高度:imageListModel.reqViewHeight 隐式宽度:image

我正在使用qml创建一个可调整大小的矩形,该矩形可以在其父窗格内部拖动,但不能在外部拖动(图1)。当我调整它的大小时,例如使用左上角的手柄,它工作得很好,不能在其父级之外调整大小(图2)。但是当我拖动整个矩形时,它可以被拖动到其父矩形之外(图3)。我的代码尝试对这两个都使用相同的逻辑,即矩形的左侧到达父节点的左侧后,它将取消拖动。可以调整大小,但拖动矩形时不行。我做错了什么

窗格{
id:compPane
隐含高度:imageListModel.reqViewHeight
隐式宽度:imageListModel.reqViewWidth
左填充:0
添加日期:0
剪辑:对
背景:矩形{
id:backgroundRect
锚定。填充:父级
颜色:“灰色”
border.color:“黑色”
边框宽度:6
}
//可拖动的可调整大小的矩形
长方形{
id:indRect
x:parent.width/4
y:parent.height/4
宽度:parent.width/2
高度:父级。宽度/2
边界{
宽度:2
颜色:“钢蓝色”
}
颜色:“354682B4”
鼠耳{
id:indImagesDragArea
锚定。填充:父级
2.5.8页边距:8
drag.target:父对象
已更改的位置:{
如果(拖动。活动){
if(indRect.x=(compPane.width-backgroundRect.border.width))
拖动。取消()
}
}
}
//左上手柄-工作正常
长方形{
宽度:15
身高:15
颜色:“钢蓝色”
锚。垂直中心:parent.top
anchors.horizontalCenter:parent.left
鼠耳{
锚定。填充:父级
游标形状:Qt.SizeFDiagCursor
拖动{target:parent;axis:drag.XAndYAxis}
已更改的位置:{
如果(拖动。活动){
//var delta=Math.max(mouseX,mouseY)
var newWidth=indRect.width-mouseX
var newHeight=indRect.height-mouseY;
if(新宽度<宽度| |新高度<高度)
回来

如果(indRect.x您可以尝试使用drag.minimum和drag.maximum的属性。 请参阅文档:

Drag.cancel()
实际上是用于实现拖放类型的交互。在这种情况下,对它的调用没有任何作用,因为您从未实际启动过这些序列中的一个。如果您注释掉对
Drag.cancel()
的调用,则左上角的句柄示例可以正常工作

左上角的示例之所以有效,是因为您限制了x和y位置更新,以便通过显式更新
indRect.x
indRect.y
将它们剪裁到场景中。您只需要对主拖动场景实施相同的技术

例如:

onPositionChanged: {
    if (drag.active){
        if (indRect.x <= 0 + backgroundRect.border.width)
            indRect.x =  0 + backgroundRect.border.width;
        if (indRect.x + indRect.width >= (compPane.width - backgroundRect.border.width) )
            indRect.x = compPane.width - backgroundRect.border.width - indRect.width;
    }
}
onPositionChanged:{
如果(拖动。活动){
if(indRect.x=(compPane.width-backgroundRect.border.width))
indRect.x=compPane.width-backgroundRect.border.width-indRect.width;
}
}

太棒了!太棒了。非常感谢您抽出时间。
onPositionChanged: {
    if (drag.active){
        if (indRect.x <= 0 + backgroundRect.border.width)
            indRect.x =  0 + backgroundRect.border.width;
        if (indRect.x + indRect.width >= (compPane.width - backgroundRect.border.width) )
            indRect.x = compPane.width - backgroundRect.border.width - indRect.width;
    }
}