锚点断开`mapFromItem`

时间:2017-04-28 10:28:11

标签: qt qml qtquick2

我有一个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,应该用同样的方法解决,我想。

1 个答案:

答案 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
    }
}

这似乎运作良好,至少对于浅层对象树。