Краткий ответ: contentItem
предназначен для настройки элемента управления и заменяет существующую реализацию элемента визуального переднего плана вашим текстом.
Длинный ответ:
A Quick Item
имеет так называемое «свойство по умолчанию» - свойство data
. По определению, если вы добавляете элемент в качестве дочернего элемента другого элемента, он вместо этого назначается свойству по умолчанию. Что означает следующий пример:
Item {
Text { text: "test1"}
}
Фактически идентичен:
Item {
data: [
Text { text: "test2"}
]
}
Если вы знаете, посмотрите на ваш пример, в первом варианте вы просто добавляете дочерний элемент к корневой кнопке. Поскольку никакой дополнительной информации не предоставлено, она помещается в координаты (0,0)
в пределах своего родителя.
Однако свойство contentItem
определяется в документации следующим образом:
Это свойство содержит элемент визуального содержимого.
В случае Button
это внутренне используемый Label
для отображения свойства text
кнопки. Он существует для изменения внешнего вида кнопки.
Во втором примере вы «настраиваете» кнопку, заменяя внутреннюю метку собственной Text
, но без какого-либо кода для правильного позиционирования или заполнения элемента. Правильный способ объявления элемента содержимого можно найти в руководстве по настройке :
Button {
id: control
text: qsTr("Button")
contentItem: Text {
text: control.text
font: control.font
opacity: enabled ? 1.0 : 0.3
color: control.down ? "#17a81a" : "#21be2b"
horizontalAlignment: Text.AlignHCenter
verticalAlignment: Text.AlignVCenter
elide: Text.ElideRight
}
// ...
}
Вы можете либо определить его как часть пользовательского стиля, либо создать MyButton.qml
, где делать именно это, и затем использовать MyButton
в других файлах QML, предоставляя вам кнопку с пользовательским стилем, сохраняя при этом API без изменений (например, возможность устанавливать текст с помощью свойства text
и т. д.)
Надеюсь, этого было достаточно, чтобы помочь вам понять, как это работает.