动态创建的组件无法访问父属性

Posted

技术标签:

【中文标题】动态创建的组件无法访问父属性【英文标题】:Dynamically created components cannot access parent properties 【发布时间】:2021-08-01 15:59:12 【问题描述】:

在我的 python & qml 项目中,我的页面结构如下

 Window
  |-myObject
  |-Loader
   |-homePage
    |-myComponent

其中 MyComponent 是我使用以下 Python 代码动态创建的组件:

root = engine.rootObjects()[0].findChild(QObject, "HomePage")
componentFigure = QQmlComponent(engine)
componentFigure.loadUrl(QUrl("components/MyComponent.qml"))
instanceFigure = componentFigure.create()
instanceFigure.setParentItem(root)

现在我想访问 myObject 属性,从 HomePage 可以正常工作,从 myComponent 它不工作(无法读取 PropertyName of undefined

我的组件创建可能有问题?

根页面代码:

Window 
    Settings 
        id: appSettings
        property bool light: true
    
    QtObject 
        id: myObject
        property color myColor: appSettings.mySetting ? "#FFFFFF" : "#000000"
    
    Rectangle 
        anchors.fill: parent
        Loader 
            anchors.fill: parent
            source: Qt.resolvedUrl("pages/homePage.qml")
        
    

我的组件代码:

MyComponent
    anchors.fill: parent
    Rectangle 
        anchors.fill: parent
        color: myObject.myColor
    

【问题讨论】:

请添加您的代码,以便我们了解您是如何尝试进行这些引用的。 【参考方案1】:

问题是myObject 只会成为根组件中的可见标识符。它不会从该文件之外的其他组件中看到。只有组件的*** QML 元素的属性在组件范围层次结构中可见。

更多信息请参见:https://doc.qt.io/qt-5/qtqml-documents-scope.html#component-scope

您需要确保在您的代码中设置了这些连接,如下所示:

instanceFigure = componentFigure.create(qmlContext(root))

但是请注意,实际上并不推荐以这种方式访问​​组件(通过父组件范围的隐式访问)。最好通过显式属性向下传递对象引用。

【讨论】:

感谢您的回复,在我当前的配置中,我可以毫无问题地从其他文件访问 myObject 的属性,问题是我无法从动态加载的组件中访问它们。不幸的是,您建议的代码并没有改变任何东西

以上是关于动态创建的组件无法访问父属性的主要内容,如果未能解决你的问题,请参考以下文章

无法访问父组件 React 打字稿中的转发 Ref 值

如果数据属性在 VueJs 中从父组件传递到子组件,则无法将其作为对象进行操作

vue父组件访问子组件的计算属性

关于protected在子类创建父类对象无法访问父类protected方法或成员

Vue.js父组件事件处理方法无法正常访问自己的数据

PHP继承的父方法无法访问孩子的私有属性