En général, l'utilisation de implicitHeight/Width
n'a de sens que dans le cadre de composants réutilisables.
Il donne une indication de la taille naturelle de l'élément sans la forcer.
Prenons un Image
à titre d'exemple. La taille naturelle de l'image fait correspondre un pixel du fichier image à un pixel de l'écran. Mais elle nous permet de l'étirer, de sorte que la taille n'est pas imposée et peut être remplacée.
Disons maintenant que nous voulons avoir une galerie avec des photos de dimension inconnue, et que nous ne voulons pas les agrandir mais seulement les réduire si nécessaire. Nous avons donc besoin de stocker la taille naturelle de l'image. C'est là que la hauteur implicite entre en jeu.
Image {
width: Math.max(150, implicitWidth)
height: Math.max(150, implicitHeight)
}
Dans les composants personnalisés, vous avez le choix sur la façon de définir les tailles.
Le seul choix possible est d'avoir toutes les dimensions relatives aux composants. root
peut-être comme ceci :
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'
}
}
Dans ce cas, il n'y a pas de taille naturelle de l'objet. Tout fonctionne parfaitement pour chaque taille que vous définissez pour le composant.
D'un autre côté, vous pouvez avoir un objet qui a une taille naturelle - cela se produit, par exemple, si vous avez les valeurs absolues qu'il contient
Item {
id: root
property alias model: repeater.model
Repeater {
id: repeater
delegate: Rectangle {
width: 100
height: 100
x: 102 * index
y: 102 * index
}
}
}
Dans cet exemple, vous devez fournir à l'utilisateur des informations sur la taille naturelle, où le contenu ne dépasse pas l'élément. L'utilisateur peut toujours décider de définir une taille plus petite et de gérer la protubérance, par exemple en la coupant, mais il a besoin des informations sur la taille naturelle pour prendre sa décision.
Dans de nombreux cas, childrenRect.height/width
est une bonne mesure pour le implcitHeight/Width
mais il existe des exemples où ce n'est pas une bonne idée. - par exemple, lorsque le contenu de l'article a x: -500
.
Un exemple concret est le Flickable
qui est spécifiquement conçu pour contenir des objets plus grands que sa propre taille. Le fait d'avoir la taille de la Flickable
pour être égal au contenu ne serait pas naturel.
Faites également attention, lorsque vous utilisez scale
dans les composants personnalisés, car le childrenRect ne sera pas informé de la mise à l'échelle.
Item {
id: root
implicitWidth: child.width * child.scale
implicitHeight: child.height * child.scale
Rectangle {
id: child
width: 100
height: 100
scale: 3
color: 'red'
}
}
Et à votre commentaire : Je ne comprends pas pourquoi il est préférable de définir implicitement la largeur/hauteur au lieu de définir la largeur/hauteur de la dimension racine d'un composant.
implicitWidht/Height
ne sont pas une nécessité - QtQuick pourrait s'en passer. Ils existent par commodité et doivent être conventionnés.
Règle d'or
Lorsque vous souhaitez définir la dimension d'un nœud racine d'un composant réutilisable, définissez le paramètre suivant implicitWidth/Height
.
Dans certains cas, il est possible de le définir pour les noeuds non-Root, si les noeuds sont exposés comme une propriété.
Ne le faites que si vous avez une raison de le faire (de nombreux composants officiels sont fournis sans aucune raison).
Lorsque vous utilisez un composant, définissez width/height
.
6 votes
Excellente question ! Je me débats avec cette question depuis un certain temps aussi !
6 votes
Excellent ! Beaucoup de gens ont des difficultés avec cela, quand ils commencent avec QML.