2016-08-15 3 views
0

Sagen wir, ich habe eine QML-Anwendung mit einer Symbolleiste:Laden Komponente mit benutzerdefinierten Eigenschaften (ohne setSource)

ApplicationWindow { 
    header: Loader { 
    source: Qt.platform.os=="linux" ? "qrc:/linux/MyTools.qml" : "qrc:/MyTools.qml" 
    } 
} 

jedoch:

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

ich dynamisch die Komponente unter Verwendung eines Loader zeigen auswählen können Wenn ich dieser Komponente benutzerdefinierte Eigenschaftswerte liefern möchte (wie oben showAdminButtons), muss ich die Methode setSource() verwenden:

ApplicationWindow { 
    header: Loader { 
    Component.onCompleted: { 
     var qml = Qt.platform.os=="linux" ? "qrc:/linux/MyTools.qml" : "qrc:/MyTools.qml"; 
     setSource(qml, {showAdminButtons:userIsAdmin()}); 
    } 
    } 
} 

Gibt es eine "QML-only" -Methode, um einem Loader Eigenschaften zu liefern, die Component.onCompleted nicht erfordert? (Ich kann nicht vollständig rechtfertigen, warum Component.onCompleted sich für mich wie eine grobe Hack-Problemumgehung anfühlt, aber es tut jedes Mal, wenn ich es verwenden muss. Es hat etwas mit der deklarativen Natur von QML gegenüber der prozeduralen Natur von JS zu tun.)

+0

ich entdeckt habe [diese Antwort] (http: //stackoverflow.com/a/27704424/405017) welche Art von sol Ves meine Frage. Es scheint jedoch nur zu funktionieren, wenn ich Eigenschaften aus den Signaturen meiner Komponenten entferne und stattdessen definiere, dass die Instanziierung Werte übergeben muss. Dadurch wird verhindert, dass Eigenschaftenaliase und Standardwerte funktionieren. – Phrogz

+1

Eine Technik namens "Datei-Selektoren" ist im Vergleich zu Loader + Qt.platform.os überlegen: http://www.ics.com/blog/mastering-qt-file-selectors – jpnurmi

Antwort

2

Methode 1: Bindung (oder eine einfache Zuordnung, wenn die Bindung nicht erforderlich ist), wenn 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(); } 
     } 
    } 
} 

Methode 2: verwenden Binding Typ:

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