Différence entre largeur, hauteur et implicitWidth / hauteur et cas d'utilisation correspondants en QML

Quelle est la différence entre width/height et implicitWidth/Height en QML? Quand définir les dimensions implicites au lieu des dimensions régulières? Quand devrait-on demander les dimensions implicites au lieu de la normale d'un composant/élément?

19
demandé sur Silex 2017-08-29 22:18:54

2 réponses

généralement, l'utilisation de implicitHeight/Width n'a de sens que dans les composants réutilisables.

il donne un indice, de la taille naturelle de l'article sans appliquer cette taille.

prenons un Image comme un exemple. La taille naturelle de l'image permet de faire correspondre un pixel du fichier image à un pixel de l'écran. Mais il nous permet de l'étirer, de sorte que la taille n'est pas appliquée et peut être remplacée.

disons que maintenant, nous voulons avoir une galerie avec des photos de dimension inconnue, et nous ne voulons pas grandir, mais seulement de la réduire si nécessaire. Nous avons donc besoin de stocker la taille normale de l'image. C'est, où l'implicite hauteur 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 est d'avoir toutes les dimensions par rapport aux composants root-nœud, 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 avez défini pour le composant.

d'un autre côté, vous pourriez avoir un objet, qui a une taille naturelle - qui se produit, par exemple si vous avez valeurs absolues dans

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 protuge pas l'article. L'utilisateur peut encore décider de définir une taille plus petite et de traiter la protrusion, par exemple en la coupant, mais il a besoin de la informations sur la taille naturelle pour prendre sa décision.

Dans de nombreux cas, childrenRect.height/width est une bonne mesure pour l' implcitHeight/Width, mais il y a des exemples où ce n'est pas une bonne idée. - par exemple, lorsque le contenu de l'élément a x: -500.

Un exemple concret est l' Flickable qui est spécifiquement conçu pour contenir des objets plus grands que sa propre taille. La taille de l' Flickable pour être égal au contenu ne serait pas naturel.

soyez également prudent, lorsque en utilisant scale dans les composantes personnalisées, car la childrenRect ne connaîtra pas 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 tout simplement pas pourquoi il est préférable de définir implicitWidth/Height au lieu de définir width/height de la dimension racine d'un composant.

implicitWidht/Height ne sont pas une nécessité - QtQuick pourrait s'en passer. Ils existent pour des raisons de commodité et doivent être Convention.


Règle

Si vous souhaitez définir la dimension d'un nœud racine d'un composant réutilisable, set implicitWidth/Height.

Dans certains cas, définissez-le pour les noeuds non-root, si les noeuds sont exposés en tant que propriété.

Ne le faites que si vous avez une raison (de nombreux composants officiels n'en ont pas).

Lorsque vous utilisez un composant, définissez width/height.

8
répondu derM 2017-08-29 23:04:31

je n'ai pas la réponse définitive, mais je peux vous dire que j'ai trouvé. En premier lieu, à partir de la documentation:

implicitWidth: real

définit la largeur ou la hauteur naturelle de L'article si aucune largeur ou hauteur est spécifié.

la taille implicite par défaut pour la plupart des éléments est 0x0, cependant certains éléments ont une taille inhérente qui ne peut pas être dépassée, exemple, Image et Text.

mais moins instructif pour la largeur:

largeur

définit la position et la taille de l'article.

width et height refléter la taille réelle de l'objet dans la scène. La taille implicite est une sorte de propriété inhérente de l'article lui-même.1

je les utilise comme suit: quand je crée un nouvel élément et qu'il peut être redimensionné, je mets une taille implicite à l'intérieur l'objet2. Quand j'utilise l'objet, je mets souvent la taille réelle explicitement à partir de l'extérieur.

la taille implicite d'un objet peut être dépassée en définissant la hauteur et la largeur.

un exemple: TextWithBackground.qml

Item {
    implicitWidth: text.implicitWidth
    implicitHeight: text.implicitHeight
    // the rectangle will expand to the real size of the item
    Rectangle { anchors.fill: parent; color: "yellow" }
    Text { id: text; text: "Lorem ipsum dolor..." }
}

un exemple: MyWindow.qml

Item {
    width: 400
    height: 300
    TextWithBackground {
         // half of the scene, but never smaller than its implicitWidth
         width: Math.max(parent.width / 2, implicitWidth)
         // the height of the element is equal to implicitHeight
         // because height is not explicitly set
    }
}

1) pour certains éléments, comme le texte, la hauteur implicite dépend de la (non-implicite) largeur.

2) la taille implicite dépend généralement de la taille implicite de ses enfants.

5
répondu Georg Schölly 2017-08-29 19:51:02