我有一个Item
,它应该相对于另一个Item
绘制自己(没有锚定,因为它们可能不是兄弟姐妹或父母 - >孩子。为此,我使用{{1方法继承到每个mapFromItem
- desecendent。
Item
这样做很好,只要我不使用锚点进行布局,但只有import QtQuick 2.0
Rectangle {
id: root
property Item origin
property point originPosition: parent.mapFromItem(origin, origin.width / 2, origin.height / 2)
width: 10
height: 10
color: 'red'
x: originPosition.x - 5
y: originPosition.y - 5
}
和x
可能会被调用,函数y
被调用,计算parent.mapFromItem(...)
的位置,并且由于参数本身不会更改,因此无法更新。
我已经想过了:那么"让他们改变!" 并将调用修改为:
origin
希望它现在更新。看起来工作,直到另一个也被锚定的层被引入:
property point originPosition: parent.mapFromitem(origin.parent, origin.x, origin.y)
现在我获得了Item {
id: root
width: 800
height: 800
Item {
width: 400
height: 400
anchors.centerIn: parent
Item {
id: myOrigin
width: 100
height: 100
anchors.right: parent.right
anchors.bottom: parent.bottom
}
}
}
在其父母中的位置更新。但是它的父母可能没有找到合适的位置而且我不会得到这个更新,这会再次破坏所有内容。
我该如何运行?
//编辑:当然,如果其中一个父母的位置在运行时被改变,它也会破坏,例如一个myOrigin
,应该用同样的方法解决,我想。
答案 0 :(得分:0)
我最后写了一个小JS函数,它为我做了映射。
为此,我爬上对象树,直到根节点添加坐标,找到origin
对象上root
的绝对位置。
然后我从this
抓取回到root
对象,减去坐标,使结果相对于this
function map(itm, cord) {
var c = itm[cord]
for (; itm.parent !== null; itm = itm.parent) {
console.log(itm, c)
c += itm[cord]
}
itm = this.parent
for (; itm.parent !== null; itm = itm.parent) {
console.log(itm, c)
c -= itm[cord]
}
return c
}
在我的例子中,这将是这样的:
import QtQuick 2.7
Rectangle {
width: 20
height: 20
color: 'green'
x: map(origin, 'x')
y: map(origin, 'y')
property Item origin
function map(itm, cord) {
var c = itm[cord]
for (; itm.parent !== null; itm = itm.parent) {
console.log(itm, c)
c += itm[cord]
}
itm = this.parent
for (; itm.parent !== null; itm = itm.parent) {
console.log(itm, c)
c -= itm[cord]
}
return c
}
}
这似乎运作良好,至少对于浅层对象树。