访问父属性不起作用 (QML)



我有一个包含ItemEntityBasePlayer),其中包含动态加载项(Modules)的Loader

现在我需要访问ModulesPlayer的属性。

打印(console.debugModuleparent.parent.parent输出

播放器_QMLTYPE_127(0x2ac147f0)

所以我想我可以通过编写parent.parent.parent.myProperty来访问Player的属性,但我的属性或子元素都没有显示在自动完成列表中。

我有什么东西不见了吗?或者这根本不可能?

我想在这种情况下,最好的方法是使用signal s和Connection s从组件内部向最外面的项目进行通信,如下所述。

它遵循从文档中复制的一个示例(其中MyItem.qml是您正在动态加载的项目):

import QtQuick 2.0
Item {
    width: 100
    height: 100
    Loader {
        id: myLoader
        source: "MyItem.qml"
    }
    Connections {
        target: myLoader.item
        onMessage: console.log(msg)
    }
}

无论如何,文件还确认:

或者,由于MyItem.qml是在Loader的范围内加载的,因此它也可以直接调用Loader或其父项中定义的任何函数。

如果我正确理解了这个问题,这与你实际想做的类似,但我发现它限制了项目的可重用性,因为它对周围环境进行了假设,我通常不喜欢它(当然,这是我的设计理念,它不会假装是最好的)。

还要注意的是,Loaderparent属性指向其视觉父级,这可能与您预期的有所不同。这是因为它实际上是一个Item,并且继承了其属性。

请参阅此处了解更多详细信息。

相反,要在创建后设置加载项的属性,而不是让它通过parent.parent...链来访问它们,您可以将这些属性放在Loader对象上,并按如下方式轻松访问它们(这是从文档中获得的另一个示例):

Item {
    width: 400
    height: 400
    Component {
        id: myComponent
        Text { text: modelIndex }
    }
    ListView {
        anchors.fill: parent
        model: 5
        delegate: Component {
            Loader {
                property int modelIndex: index
                sourceComponent: myComponent
            }
        }
    }
}

事实上,正如文档中所述,您可以:

[…]显式地将所需信息设置为Loader的属性(这是因为Loader将自己设置为正在加载的组件的上下文对象)。

关于组件的范围,从这里你可以发现:

组件作用域是组件内对象ID和组件根对象属性的并集。

相关内容

  • 没有找到相关文章

最新更新