如何在重新生成QML对象时避免锚定错误

时间:2017-10-15 11:23:38

标签: qml

在QML项目中,我希望显示图形效果,并且在动画期间,我希望禁用GUI的一部分。物品必须不知道它是如何精确使用的。 我通过向我的组件添加目标属性来“冻结”并使用捕获事件的MouseArea填充此目标组件来实现此行为。 到目前为止,我对此行为完全满意,除了在运行时出现的小错误:

QML MouseArea: Cannot anchor to an item that isn't a parent or sibling.

这是MouseArea的代码(grid是我用来测试的id):

Item
{
    id: starterCircle
    property var freeze: grid

    MouseArea
    {
        id: inhibit
        parent: starterCircle.freeze.parent 
        anchors.fill: starterCircle.freeze // generates an error before re-parenting
    }
}

如果我将MouseArea更改为此,我不会被错误所困扰,但对我来说这看起来像是一个肮脏的黑客:

    MouseArea
    {
        id: inhibit
        parent: starterCircle.freeze.parent 
        onParentChanged: if (starterCircle.freeze.parent === parent) anchors.fill = starterCircle.freeze
    }

我应该提一个奇怪的行为:如果我更改MouseArea的{​​{1}}的父属性,我会在日志中打印两次相同的父级,并且不再有错误。也就是说,以下代码没有错误:

parent

请注意,我可能会遇到错误或黑客攻击,以防止生成错误。但我可能错过了一些东西,以使事情正确。我正在使用Qt 5.9.2。

1 个答案:

答案 0 :(得分:0)

最简单的方法是使用条件绑定:

anchors.fill: (starterCircle.freeze.parent === parent 
               ? starterCircle.freeze
               : null)