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
root
的 start
和 end
属性缺少对同一对象的 x
和 [=16] 的“强制”依赖=]
出于某种原因,您决定不仅要设置路径点的坐标,还要移动整个 Connection
元素本身。因此,如果 root
的 x
和 y
恰好在 start
和 end
之后更新,后者仍然包含 [=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)
(这里有更多的建议以防万一这不起作用但它们被删除了因为上面似乎已经解决了问题)
尝试在 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
root
的 start
和 end
属性缺少对同一对象的 x
和 [=16] 的“强制”依赖=]
出于某种原因,您决定不仅要设置路径点的坐标,还要移动整个 Connection
元素本身。因此,如果 root
的 x
和 y
恰好在 start
和 end
之后更新,后者仍然包含 [=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)
(这里有更多的建议以防万一这不起作用但它们被删除了因为上面似乎已经解决了问题)