2016-08-15 27 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() 
     } 
    } 
}