Ich mag QML wirklich. Ich mag es, wie ich Komponenten (vergleichbar mit Klassen) und ihre Eigenschaften definieren und von irgendwoher instanziieren kann (vergleichbar mit Objekten).Wie definiert man eine "Vorlage" mit untergeordneten Platzhaltern in QML?
Ich kann definieren, sagen wir mal, eine Schaltfläche, einige Look-and-Feel, und einen Label-Text darauf. Dies könnte zum Beispiel dieser Komponente Definition (Button.qml
):
Item {
id: button
property string label
anchors.fill: parent
Rectangle {
anchors.fill: parent
radius: 10
color: "gray"
Text {
anchors.centerIn: parent
font.pixelSize: 20
text: button.label
color: "white"
}
}
}
und instanziiert in dieser Hauptdatei (main.qml
):
Rectangle {
width: 300
height: 200
Button {
anchors.centerIn: parent
anchors.margins: 50
label: "Hello button!"
}
}
Aber ich sehe die folgende Einschränkung: Ich kann nur Definieren Sie eine Schaltflächenvorlage mit einigen Eigenschaften, nicht mit einigen Platzhalter. Alle untergeordneten Objekte, die in der Instanz definiert sind, sind mindestens standardmäßig untergeordnete Elemente, und ich möchte dieses Verhalten ändern.
Nehmen wir an, ich möchte ein Element (sagen wir ein Bild, aber ich will nicht die Definition von Button
, dass es ein Bild sein wird) in der Schaltfläche platzieren. Ich stelle mir so etwas vor:
Item {
id: button
property Item contents <-- the client can set the placeholder content here
anchors.fill: parent
Rectangle {
anchors.fill: parent
radius: 10
color: "gray"
Item {
id: placeholder <-- where the placeholder should be inserted
}
}
Component.onCompleted: {
// move the contents into the placeholder...
}
}
Wie kann ich das erreichen? Ich weiß nicht, ob Component.onCompleted
der richtige Weg ist. Beachten Sie jedoch, dass sich in meinem Fall die Inhalte nie ändern werden (zumindest in meinem aktuellen Design der Anwendung ...).
Auch möchte ich Verankerung innerhalb des Platzhalters arbeiten. Zum Beispiel, wenn ich den Inhalt als ein Text-Element definiere, das in seinem Elternteil zentriert ist (welches zuerst die Vorlage selbst sein wird). Dann verschiebt mein Code diese Textinstanz in den Platzhalter und die übergeordneten Anker sollten dann diejenigen des Platzhalterelements sein, nicht das Vorlagenelement.
BTW, wenn Sie noch Fragen über das QML-Scope-Puzzle aus dem Gespräch sind, finden Sie unter: http://StackOverflow.com/Questions/11339719/qml-Component-Scope-Puzzle – mlvljr
Fantastisch, danke für diesen Link!;) Übrigens kann der "d-pointer" (auch in diesem Vortrag) verwendet werden, um private Mitglieder (auch JS-Funktionen) besser zu verstecken. Ich finde es besser als die doppelte Unterstreichung. Ich nenne es sogar "priv", um sicherzustellen, dass niemand versehentlich auf Mitglieder dieses Kindobjekts zugreift. – leemes
Interessant, erinnere mich nicht daran (d-ptr), das ist also eine Art QML/js pimpl? – mlvljr