Qt 正在加载具有自定义属性的组件(不带setSource)

Qt 正在加载具有自定义属性的组件(不带setSource),qt,qml,Qt,Qml,假设我有一个带有工具栏的QML应用程序: ApplicationWindow{ 标题:MyTools{ showAdminButtons:userIsAdmin() } } 我可以使用以下命令动态选择要显示的组件: ApplicationWindow{ 收割台:装载机{ 来源:Qt.platform.os==“linux”?“qrc:/linux/MyTools.qml”:“qrc:/MyTools.qml” } } 但是,如果我想为该组件提供自定义属性值(如上面的showAdminButt

假设我有一个带有工具栏的QML应用程序:

ApplicationWindow{
标题:MyTools{
showAdminButtons:userIsAdmin()
}
}
我可以使用以下命令动态选择要显示的组件:

ApplicationWindow{
收割台:装载机{
来源:Qt.platform.os==“linux”?“qrc:/linux/MyTools.qml”:“qrc:/MyTools.qml”
}
}
但是,如果我想为该组件提供自定义属性值(如上面的
showAdminButtons
),我必须使用
setSource()
方法:

ApplicationWindow {
  header: Loader {
    Component.onCompleted: {
      var qml = Qt.platform.os=="linux" ? "qrc:/linux/MyTools.qml" : "qrc:/MyTools.qml";
      setSource( qml, {showAdminButtons:userIsAdmin()} );
    }
  }
}
是否有“仅限QML”的方式向加载程序提供属性,而不需要
组件。未完成的
?(我无法完全解释为什么
组件。onCompleted
对我来说就像是一个彻底的黑客解决方案,但每次我不得不使用它时,它确实是这样。这与QML的声明性性质与JS的过程性性质有关。)

方法1:绑定(或者简单的赋值,如果不需要绑定):

方法2:使用类型:

我已经发现哪种方法可以解决我的问题。但是,只有当我从组件的签名中删除属性,并将它们定义为需要实例化来传递值时,它才起作用。它阻止属性别名和默认值工作。与Loader+Qt.platform.os相比,名为“文件选择器”的技术更优越:
ApplicationWindow {
    header: Loader {
        source: Qt.platform.os=="linux" ? "qrc:/linux/MyTools.qml" : "qrc:/MyTools.qml"
        onLoaded: {
            item.showAdminButtons = Qt.binding(function() { return userIsAdmin(); }
        }
    }
}
ApplicationWindow {
    header: Loader {
        id: loader
        source: Qt.platform.os=="linux" ? "qrc:/linux/MyTools.qml" : "qrc:/MyTools.qml"
        Binding {
            target: loader.item
            property: "showAdminButtons"
            value: userIsAdmin()
        }
    }
}