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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了访问父项的属性不起作用(QML)相关的知识,希望对你有一定的参考价值。

我有一个EntityBasePlayer),其中包含Item,其中包含动态加载项目的LoaderModules)。

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

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

Player_QMLTYPE_127(0x2ac147f0)

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

有什么我想念的吗?或者这根本不可能?

答案

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

它遵循从文档中复制的示例(其中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或其父Item中定义的任何函数。

如果我正确地理解了这个问题,那就类似于你实际上要做的事情,但我发现它限制了项目的可重用性,因为它对周围环境做出了假设,而我通常不喜欢它(当然,这是我的设计理念,它并不是假装最好的设计。

另请注意,Loader的父属性指向其可视父级,可能与您期望的不同。那是因为它实际上是一个Item并且它继承了它的父属性。

有关详细信息,请参阅here

相反,要在加载的项目上创建属性,而不是通过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将自己设置为正在加载的组件的上下文对象)。

关于组件的范围,从here您可以发现:

组件范围是组件中对象ID与组件根对象属性的并集。

以上是关于访问父项的属性不起作用(QML)的主要内容,如果未能解决你的问题,请参考以下文章

使用父项的一个属性获取特定类的所有属性

如何将父项的第一个子项中的属性移动到 XSLT 中的父项?

来自活动xml的片段中的findViewById属性不起作用[重复]

在 QML 中的委托中访问 modelData

qml Textfield中的换行符,文本属性不起作用

Bootstrap 3下拉菜单中心对齐不起作用