2016-08-15 74 views
0

说我有一个工具栏QML应用:与自定义属性(没有的SetSource)加载组件

ApplicationWindow { 
    header: MyTools { 
    showAdminButtons: userIsAdmin() 
    } 
} 

我可以动态地挑选组件用Loader显示:

ApplicationWindow { 
    header: Loader { 
    source: 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”的方式为装载程序提供属性,该程序不需要Component.onCompleted? (我不能完全证明为什么Component.onCompleted对我来说感觉像是一个非常糟糕的解决方法,但它每次都必须使用它,这与QML的声明性质和JS的程序性质有关。)

+0

我发现[此答案](HTTP: //stackoverflow.com/a/27704424/405017)哪种解决方案我的问题。但是,它似乎只在我从组件的签名中移除属性,而是将它们定义为需要实例化来传递值时才起作用。它阻止了属性别名和默认值的运行。 – Phrogz

+1

与Loader + Qt.platform.os相比,名为“文件选择器”的技术更为出色:http://www.ics.com/blog/mastering-qt-file-selectors – jpnurmi

回答

2

方法1:结合(或简单的赋值如果结合是不必要的)时Loader.onLoaded

ApplicationWindow { 
    header: Loader { 
     source: Qt.platform.os=="linux" ? "qrc:/linux/MyTools.qml" : "qrc:/MyTools.qml" 
     onLoaded: { 
      item.showAdminButtons = Qt.binding(function() { return userIsAdmin(); } 
     } 
    } 
} 

方法2:使用Binding类型:

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() 
     } 
    } 
}