Qt Quick 绑定在启动时未更新

Qt Quick bindings not updated at startup

尝试在 Qt Quick 中制作一个非常简单的节点编辑器。

最棘手的部分似乎是 Connection 项,它必须跟踪源和目标 IOPort 的两个 绝对 位置。

以下代码工作正常,除了绑定在启动时未被评估(或以错误的顺序评估),导致连接线在启动时处于错误的位置:

一旦任一节点移动,它就会被调整到正确的位置:

我考虑添加:

Component.onCompleted: {
    start = mapFromItem(from, 0, 0)
    end = mapFromItem(to, 0, 0)
}

Connection,它修复了启动问题,但破坏了绑定。

所以我求助于这个丑陋的技巧:

Component.onCompleted: {
    from.x = from.x+1
    from.x = from.x-1
}

这个问题有更好的解决办法吗?

(GitHub 存储库中可用的文件,link 在底部)

main.qml:

import QtQuick 2.15
import QtQuick.Window 2.15

Window {
    width: 420
    height: 280
    visible: true
    title: qsTr("Node editor")

    Node {
        x: 20
        y: 40
        width: 120
        height: 50

        IOPort {id: o1; x: 0; y: parent.height}
    }

    Node {
        x: 260
        y: 140
        width: 120
        height: 50

        IOPort {id: i1; x: 0; y: 0}
    }

    Connection {
        from: o1; to: i1
    }
}

Node.qml:

import QtQuick 2.0

Rectangle {
    id: rect
    border.color: "black"
    border.width: 2
    color: "#eee"

    MouseArea {
        anchors.fill: parent
        drag.target: rect
    }
}

IOPort.qml:

import QtQuick 2.0

Item {
    id: root
    property real size: 15
    property real globalX: x + parent.x
    property real globalY: y + parent.y
    property real globalZ: 1 + parent.z

    Rectangle {
        id: rect
        x: -width/2
        y: -height/2
        width: root.size
        height: root.size
        border.color: "black"
        color: "gray"
    }
}

Connection.qml:

import QtQuick 2.0
import QtQuick.Shapes 1.15

Shape {
    id: root
    property IOPort from
    property IOPort to
    x: Math.min(from.globalX, to.globalX)
    y: Math.min(from.globalY, to.globalY)
    z: Math.max(from.globalZ, to.globalZ) + 0.5
    width: Math.abs(from.globalX - to.globalX)
    height: Math.abs(from.globalY - to.globalY)
    property point start: from.globalX, from.globalY, to.globalX, to.globalY, mapFromItem(from, 0, 0)
    property point end: from.globalX, from.globalY, to.globalX, to.globalY, mapFromItem(to, 0, 0)

    ShapePath {
        strokeWidth: 4
        strokeColor: "black"
        startX: root.start.x
        startY: root.start.y
        PathLine {
            x: root.end.x
            y: root.end.y
        }
    }
}

GitHub 存储库:https://github.com/fferri/qtquick-simple-node-editor.git

我目前无法重现错误,但我想我发现了一个问题:

您的 Connection rootstartend 属性缺少对同一对象的 x 和 [=16] 的“强制”依赖=]

出于某种原因,您决定不仅要设置路径点的坐标,还要移动整个 Connection 元素本身。因此,如果 rootxy 恰好在 startend 之后更新,后者仍然包含 [=15] 时点的相对坐标=] 和 y 仍然是默认值(可能是 0,0),因此该行被替换 x,y 像素。

尝试以这种方式更改它们(我还删除了您不需要的依赖项):

property point start: from.globalX, from.globalY, x, y, mapFromItem(from, 0, 0)
property point end: x, y, to.globalX, to.globalY, mapFromItem(to, 0, 0)

(这里有更多的建议以防万一这不起作用但它们被删除了因为上面似乎已经解决了问题)