首页 > 解决方案 > QML从抽屉拖动到另一个项目,当抽屉关闭时如何保持连续拖动

问题描述

我的目标是从 中拖放一个副本item并将drawer其放到另一个item. 当我按住 时item,我会创建一个新Rectangle的并将其重新设置为新的parent并将其设置为当drag.target 我越过. 我的问题是我失去了对拖拽的控制。即使被调用,我怎么能继续拖动。这是一个工作示例:close()drawerdraweritemitemdrawer.close()

import QtQuick 2.4
import QtQuick.Controls 2.1

ApplicationWindow {
    width: 600
    height: 600
    visible: true
    Item{
        id: root

        Drawer{
            id:drawer
            width: 0.5 * parent.width
            height: parent.height
            edge: Qt.RightEdge

            Rectangle {
                id: item
                border.width: 2
                x: 100
                y: 100
                width: 100
                height: 100


                MouseArea {
                    id: mouseArea
                    anchors.fill: parent

                    onPressAndHold: {
                        var newItem = createShadow(item)
                        newItem.parent = root
                        drag.target = newItem

                    }
                    onMouseXChanged: {
                        //hard coding the cursor crossing the drawer boundary
                        var point = mapToItem(root, mouseX, mouseY)
                        if (point.x < 300)
                            drawer.close()
                    }

                    onReleased: {
                        drag.target.Drag.drop()
                    }
                }
            }
        }

        DropArea {
            anchors.fill: parent
            onDropped: {
                //do something
            }
        }
    }

    function createShadow(itm) {
        //assuming we are fetching geometry from itm
        var component = Qt.createQmlObject('import QtQuick 2.4; Rectangle{x:400;y:100;width:100;height:100;opacity:0.2;color:"black"}',root, "asdf");

        return component
    }
}

标签: qtqmlqt5

解决方案


您还应该MouseArea在拖动期间重新设置,以便继续接收onMouseXChanged事件:

onPressAndHold: {
    var newItem = createShadow(item)
    newItem.parent = root
    drag.target = newItem
    parent = root
}
// ...
onReleased: {
    drag.target.Drag.drop()
    parent = item
}

推荐阅读