【问题标题】: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
    }
}

【问题讨论】:

  • 请添加您的代码,以便我们了解您是如何尝试进行这些引用的。

标签: python pyqt qml pyside pyside2


【解决方案1】:

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

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

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

instanceFigure = componentFigure.create(qmlContext(root))

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

【讨论】:

  • 感谢您的回复,在我当前的配置中,我可以毫无问题地从其他文件访问 myObject 的属性,问题是我无法从动态加载的组件中访问它们。不幸的是,您建议的代码并没有改变任何东西
猜你喜欢
  • 1970-01-01
  • 2019-06-15
  • 2020-06-17
  • 2016-04-10
  • 2010-10-09
  • 2016-02-11
  • 1970-01-01
  • 2016-05-17
  • 1970-01-01
相关资源
最近更新 更多