Ответ 1
Как правило, использование implicitHeight/Width
имеет смысл только в компонентах многократного использования.
Он дает подсказку о натуральном размере предмета без соблюдения этого размера.
В качестве примера возьмем Image
. Естественный размер изображения будет отображать один пиксель из файла изображения в один пиксель на экране. Но это позволяет нам растягивать его, поэтому размер не применяется и может быть переопределен.
Скажем сейчас, мы хотим иметь галерею с изображениями неизвестного измерения, и мы не хотим расти, а только при необходимости сокращаем их. Поэтому нам нужно сохранить естественный размер изображения. То есть, когда подразумеваемая высота вступает в игру.
Image {
width: Math.max(150, implicitWidth)
height: Math.max(150, implicitHeight)
}
В пользовательских компонентах у вас есть выбор, как определить размеры.
Один из вариантов состоит в том, чтобы иметь все размеры относительно компонентов root
-node, может быть, вот так:
Item {
id: root
Rectangle {
width: root.width * 0.2
height: root.height * 0.2
color: 'red'
}
Rectangle {
x: 0.2 * root.width
y: 0.2 * root.height
width: root.width * 0.8
height: root.height * 0.8
color: 'green'
}
}
В этом случае нет естественного размера объекта. Все отлично работает для каждого размера, заданного для компонента.
С другой стороны, у вас может быть объект, который имеет естественный размер - это происходит, например, если у вас есть абсолютные значения в нем
Item {
id: root
property alias model: repeater.model
Repeater {
id: repeater
delegate: Rectangle {
width: 100
height: 100
x: 102 * index
y: 102 * index
}
}
}
В этом примере вы должны предоставить пользователю информацию о натуральном размере, в котором контент не защищает элемент. Пользователь может все же решить установить меньший размер и иметь дело с выступом, например, отсекая его, но ему нужна информация о натуральном размере, чтобы принять его решение.
Во многих случаях childrenRect.height/width
является хорошей мерой для implcitHeight/Width
, но есть примеры, где это не очень хорошая идея. - например, когда содержимое элемента имеет x: -500
.
Пример реальной жизни - это Flickable
, специально предназначенный для хранения больших объектов, чем его собственный размер. Имея размер Flickable
чтобы быть равным содержанию, не было бы естественным.
Также будьте осторожны при использовании scale
в пользовательских компонентах, поскольку childRect не будет знать о масштабировании.
Item {
id: root
implicitWidth: child.width * child.scale
implicitHeight: child.height * child.scale
Rectangle {
id: child
width: 100
height: 100
scale: 3
color: 'red'
}
}
И к вашему комментарию: я просто не понимаю, почему лучше установить implicitWidth/Height вместо установки ширины/высоты корневого размера компонента.
implicitWidht/Height
не являются необходимыми - QtQuick может обойтись без них. Они существуют для удобства и должны быть условными.
Практическое правило
Если вы хотите установить размер корневого узла повторно используемого компонента, установите значение
implicitWidth/Height
.
В некоторых случаях установите его для non-root -node s, если узлы отображаются как свойство.
Сделайте это только, если у вас есть причина для этого (многие официальные компоненты приходят без каких-либо).
Когда вы используете компонент, задайтеwidth/height
.