Мне очень нравится QML. Мне нравится, как я могу определить компоненты (сравнимые с классами) и их свойствами, и создавать их из другого места (сопоставимые с объектами).
Я могу определить, допустим, кнопку, имеющую некоторый внешний вид и текст ярлыка. Это можно сделать, например, используя это определение компонента (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"
}
}
}
и инстанцируется в этом основном файле (main.qml
):
Rectangle {
width: 300
height: 200
Button {
anchors.centerIn: parent
anchors.margins: 50
label: "Hello button!"
}
}
Но я вижу следующее ограничение: я могу определить шаблон кнопки с некоторыми свойствами, а не с каким-то заполнителем. Все дети, определенные в экземпляре, будут прямыми детьми, по крайней мере, по умолчанию, и я хочу изменить это поведение.
Скажем, я хочу поместить элемент (скажем, изображение, но я не хочу сказать определение Button
, что это будет изображение) в кнопке. Я представляю себе что-то вроде этого:
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...
}
}
Как я могу это достичь? Я не знаю, правильно ли используется Component.onCompleted
. Обратите внимание, что, однако, в моем случае содержимое никогда не изменится после (по крайней мере, в моем текущем дизайне приложения...).
Кроме того, я хочу, чтобы привязка работала внутри заполнителя. Например, если я определяю содержимое как элемент Text, находясь в центре его родителя (который сначала будет самим шаблоном). Затем мой код перемещает этот экземпляр Text в заполнитель, а родительские привязки должны быть такими же, что и в элементе-заполнителе, а не в элементе шаблона.