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