2017-08-29 9 views
9

width/heightimplicitWidth/Heightの違いは何ですか?正規表現の代わりに暗黙の次元を設定する必要があるのはいつですか?コンポーネント/アイテムからレギュラーではなく暗黙のディメンションを要求する必要があるのはいつですか?QMLのwidth、height、およびimplicitWidth/Heightと対応するユースケースの違い

+1

大きな質問です!私はかなりこれも苦労してきました! –

+1

優秀! QMLを使い始めると、たくさんの人々がこれに苦しんでいます。 – derM

答えて

5

一般的に、implicitHeight/Widthの使用は再利用可能なコンポーネント内でのみ意味があります。

このサイズを強制することなくItemの自然なサイズのヒントを示します。

例としてImageを考えてみましょう。画像の自然なサイズは、画像ファイルの1つのピクセルを画面上の1つのピクセルにマッピングします。しかし、それは私たちがそれを伸ばすことを可能にするので、サイズは強制されず、上書きすることができます。

ここで、未知の次元の写真を含むギャラリーを作成したいとしましょう。必要に応じて拡大するだけではなく、縮小したいと考えています。そのため、画像の自然な大きさを保存する必要があります。つまり、暗示的な高さが作用する場所です。

Image { 
    width: Math.max(150, implicitWidth) 
    height: Math.max(150, implicitHeight) 
} 

カスタムコンポーネントでは、サイズの定義方法を選択できます。

1つの選択肢は、おそらくこのような成分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 
     } 
    } 
} 

絶対値を持っている場合は、コンテンツがアイテムをprotudeしない自然なサイズに関する情報をユーザに提供する必要があります。ユーザは、より小さいサイズを設定し、突起に対処することを依然として決める可能性がある。それを切り抜くことによって、しかし彼は彼の決定をするために自然なサイズに関する情報を必要とする。

多くの場合、childrenRect.height/widthimplcitHeight/Widthの良い措置ですが、これは良い考えではない例があります。 - 例えば商品の内容がx: -500の場合

Flickable実際の例は、独自のサイズより大きなオブジェクトを含むように特別に設計されています。 Flickableのサイズをコンテンツと同じにすることは自然ではありません。

カスタムコンポーネントでscaleを使用する場合、childrenRectはスケーリングについて認識しないため、注意してください。

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 /高さの代わりに、コンポーネントのルートの寸法の幅/高さを設定を設定した方がよい理由を私は理解していません。

implicitWidht/Heightは必須ではありません - QtQuickはそれらなしで行うことができます。便宜のために存在し、条約とする。親指


ルールあなたは、再利用可能なコンポーネントのルート・ノードの大きさを設定したい場合は、implicitWidth/Heightを設定します。
ノードがプロパティとして公開されている場合は、非ルートノードに設定することもあります。
理由がある場合(多くの公式コンポーネントには何も付属していません)、そのようにしてください。
コンポーネントを使用する場合は、width/heightと設定します。

+0

dermとGeorgSchöllyにお返事ありがとうございます。私はこの答えが少し好きです。なぜなら、もう少し深い説明があり、 "Thumbのルール"の+1があるからです。また、私のコメントに対する答えに感謝します。私は似たようなことを考えていた、それは良い習慣である。今のところこの回答を受け入れていますが、これについて他の投稿/コメント/議論があることを願っています。 – Silex

+0

非常に素晴らしい完全な答え。タグはこのトピックに関する良い答えが欠けていました。 :) – BaCaRoZzo

4

私は決定的な答えはありませんが、私が知ったことを教えてくれます。まず、from the documentation

implicitWidth:何の幅または高さ が指定されていない場合は、実際の

は、項目の自然な幅や高さを定義します。ほとんどの項目について

デフォルトの暗黙的なサイズは0x0の、本来の暗黙の 例えば、オーバーライドすることはできませんサイズ、ImageTextを持って しかし、いくつかの項目です。

しかしless informative for width

は、アイテムの位置とサイズを定義します。

widthおよびheightは、シーン内のアイテムの実際のサイズを反映しています。暗黙的なサイズは、アイテムそのものの固有の性質の一種です。

次のように私はそれらを使用する:私は、新しいアイテムを作成し、サイズを変更することができる場合、私は、内部オブジェクト暗黙のサイズを設定します。オブジェクトを使用しているときに、実際にはの外から実際にサイズをに設定します。

オブジェクトの暗黙のサイズは、高さと幅を設定することで上書きできます。

例: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..." } 
} 

例:いくつかの要素について

1 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 
    } 
} 
)は、テキストと同様に、暗黙的な高さに依存します(暗黙的ではない)幅。
2)暗黙的なサイズは、通常、その子の暗黙のサイズに依存します。

+2

要約:暗黙的なサイズは、オブジェクトが占有したい領域です。サイズは、実際に占有する領域です。 – Felix

+1

'Text'の場合、' implicitWidth'は、折り返しがない場合にテキストが占有する幅です。 'contentWidth'はラッピングがある場合の' Item'の実際の幅です(ラッピングがない場合は 'implicitWidth'と同じです)。 – GrecKo

+1

私はこれも私がそれを理解した方法だと思います。したがって、要約すると、コンポーネントのディメンションを「プリセット」し、それを上書きするときには通常のディメンションを使用する暗黙のディメンションを使用します。暗黙の次元は、通常の幅/高さが設​​定されていない場合のフォールバック値のようなものです。私はここで理にかなっていますか? – Silex

関連する問題