Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt QML中的条件拖放_Qt_Qml - Fatal编程技术网

Qt QML中的条件拖放

Qt QML中的条件拖放,qt,qml,Qt,Qml,此代码生成两个放置区域和一个蓝色的可拖动矩形。 我希望蓝色的矩形能够只在金色的下降区域下降。另一个放置区域应拒绝接受此特定矩形 我可以写些什么来实现这一点 因此,在这段代码中,颜色为“gold”的DropArea有“xyz”键,我将Drag.keys:“xyz”设置为应该拖动的蓝色矩形 现在,蓝色矩形被排除在另一个下降区域,但不在金色区域 我做错了什么 import QtQuick 2.4 import QtQuick.Window 2.2 Window { id: win w

此代码生成两个放置区域和一个蓝色的可拖动矩形。
我希望蓝色的矩形能够只在金色的下降区域下降。另一个放置区域应拒绝接受此特定矩形

我可以写些什么来实现这一点

因此,在这段代码中,颜色为“gold”的DropArea有“xyz”键,我将
Drag.keys:“xyz”
设置为应该拖动的蓝色矩形

现在,蓝色矩形被排除在另一个下降区域,但不在金色区域

我做错了什么

import QtQuick 2.4
import QtQuick.Window 2.2

Window {
    id: win
    width: 800
    height: 600
    title: "Drag & drop example"
    visible: true

    Repeater {
        model: 1
        Rectangle {
            id: rect
            width: 50
            height: 50
            z: mouseArea.drag.active ||  mouseArea.pressed ? 2 : 1
            color: Qt.rgba(Math.random(), Math.random(), Math.random(), 1)
            x: Math.random() * (win.width / 2 - 100)
            y: Math.random() * (win.height - 100)
            property point beginDrag
            property bool caught: false
            border { width:2; color: "white" }
            radius: 5
            Drag.active: mouseArea.drag.active

            Text {
                anchors.centerIn: parent
                text: index
                color: "white"
            }
            MouseArea {
                id: mouseArea
                anchors.fill: parent
                drag.target: parent
                Drag.keys: "xyz"
                onPressed: {
                    rect.beginDrag = Qt.point(rect.x, rect.y);
                }
                onReleased: {
                    if(!rect.caught) {
                        backAnimX.from = rect.x;
                        backAnimX.to = beginDrag.x;
                        backAnimY.from = rect.y;
                        backAnimY.to = beginDrag.y;
                        backAnim.start()
                    }
                }

            }
            ParallelAnimation {
                id: backAnim
                SpringAnimation { id: backAnimX; target: rect; property: "x"; duration: 500; spring: 2; damping: 0.2 }
                SpringAnimation { id: backAnimY; target: rect; property: "y"; duration: 500; spring: 2; damping: 0.2 }
            }
        }
    }

    Rectangle
    {
        x: 0; y: 0
        width: 200
        height: 200
        color: "gold"
        DropArea {
            anchors.fill: parent
            keys: "xyz"
            onEntered: drag.source.caught = true;
            onExited: drag.source.caught = false;
        }
    }

    Rectangle
    {
        x: 0; y: 300
        width: 200
        height: 200
        color: "red"
        DropArea {
            anchors.fill: parent
            keys: "abc"
            onEntered: drag.source.caught = true;
            onExited: drag.source.caught = false;
        }
    }
}
您应该使用
DropArea
和相关类中的属性。正如Qt文档中所述,这被用作拖放事件的过滤器

...

Rectangle { 
    Drag.keys: "gold" //only allow drag to gold
    MouseArea {
        id: mouseArea
        anchors.fill: parent
        drag.target: parent
        onPressed: {
            rect.beginDrag = Qt.point(rect.x, rect.y);
        }
        ...
    }
}

...

Rectangle
{
    x: 0; y: 0
    width: 200
    height: 200
    color: "gold"
    DropArea {
        anchors.fill: parent
        keys: "gold"
        onEntered: drag.source.caught = true;
        onExited: drag.source.caught = false;
    }
}

Rectangle
{
    x: 0; y: 300
    width: 200
    height: 200
    color: "red"
    DropArea {
        anchors.fill: parent
        keys: "red"
        onEntered: drag.source.caught = true;
        onExited: drag.source.caught = false;
    }
}
不应忽略红色矩形的键,否则它将接受所有拖动源


此外,如果希望接受多个源,可以指定键列表:

DropArea {
    keys: ["gold", "nuggets", "at", "the", "end", "of", "a", "rainbow"]
}
拖动源也是如此:

Drag.keys: ["gold", "bar", "in", "the", "back"]
您应该使用
DropArea
和相关类中的属性。正如Qt文档中所述,这被用作拖放事件的过滤器

...

Rectangle { 
    Drag.keys: "gold" //only allow drag to gold
    MouseArea {
        id: mouseArea
        anchors.fill: parent
        drag.target: parent
        onPressed: {
            rect.beginDrag = Qt.point(rect.x, rect.y);
        }
        ...
    }
}

...

Rectangle
{
    x: 0; y: 0
    width: 200
    height: 200
    color: "gold"
    DropArea {
        anchors.fill: parent
        keys: "gold"
        onEntered: drag.source.caught = true;
        onExited: drag.source.caught = false;
    }
}

Rectangle
{
    x: 0; y: 300
    width: 200
    height: 200
    color: "red"
    DropArea {
        anchors.fill: parent
        keys: "red"
        onEntered: drag.source.caught = true;
        onExited: drag.source.caught = false;
    }
}
不应忽略红色矩形的键,否则它将接受所有拖动源


此外,如果希望接受多个源,可以指定键列表:

DropArea {
    keys: ["gold", "nuggets", "at", "the", "end", "of", "a", "rainbow"]
}
拖动源也是如此:

Drag.keys: ["gold", "bar", "in", "the", "back"]

我试过你的代码,发现你做错了什么。您在错误的位置设置了
拖动.keys
。与其在
MouseArea
中设置它,不如在被拖动的对象中设置它

        Rectangle {
            id: rect
            ...
            Drag.active: mouseArea.drag.active
            Drag.keys: "xyz"

            MouseArea {
                id: mouseArea
                anchors.fill: parent
                drag.target: parent
                ...
            }
        }

我试过你的代码,发现你做错了什么。您在错误的位置设置了
拖动.keys
。与其在
MouseArea
中设置它,不如在被拖动的对象中设置它

        Rectangle {
            id: rect
            ...
            Drag.active: mouseArea.drag.active
            Drag.keys: "xyz"

            MouseArea {
                id: mouseArea
                anchors.fill: parent
                drag.target: parent
                ...
            }
        }

非常感谢。我已经编辑了这个问题。我请求你帮助我。@Aquarius_Girl我已经编辑了我的答案,我的理解是,在带有“xyz”键的拖放区域中,应该接受“xyz”键。我编辑的代码拒绝这样做。我想不出这个问题。看到JarMan的答案,我也更新了我的问题(顺便说一句,你可能不应该编辑原始问题中的更新部分)谢谢。我已经编辑了这个问题。我请求你帮助我。@Aquarius_Girl我已经编辑了我的答案,我的理解是,在带有“xyz”键的拖放区域中,应该接受“xyz”键。我编辑的代码拒绝这样做。我想不出这个问题。看看JarMan的答案,我也更新了我的问题(顺便说一句,你可能不应该编辑原始问题中更新的部分)我们不应该在droparea中设置键吗?它如何知道接受哪些密钥?是的,保持代码的这一部分不变。只需更改放置Drag.keys的位置。我们不应该在droparea中也设置这些键吗?它如何知道接受哪些密钥?是的,保持代码的这一部分不变。只需更改放置Drag.keys的位置。