2017-08-29 69 views

回答

5

通常,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 
     } 
    } 
} 

絕對值在這個例子中,你應該提供有關自然大小,其中內容不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的回答。我更喜歡這個答案,因爲它有一個更深入的解釋和+1的「經驗法則」。也感謝我的評論的答案。我在想類似的東西,這是一個很好的做法。現在接受這個答案,但我希望會有其他帖子/評論/討論。 – Silex

+0

非常好的完整答案。該標籤在這個話題上缺乏很好的答案。 :) – BaCaRoZzo

4

我沒有明確的答案,但我可以告訴你我發現了什麼。首先,from the documentation

implicitWidth:如果沒有指定寬度或高度 是真正

定義項目的自然寬度或高度。

默認隱含尺寸對於大多數項爲0x0,然而,一些物品 具有不能被重寫,用於 例如,ImageText固有隱含尺寸。

less informative for width

寬度

定義項目的位置和大小。

widthheight反映場景中物品的實際尺寸。隱含大小是項目本身的某種固有屬性。

我使用它們如下:當我創建一個新的項,它可以被調整大小,我設置一個隱含的大小內部對象。當我使用該對象時,我經常從外部明確設置實際尺寸

對象的隱式大小可以通過設置高度和寬度來覆蓋。

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

一個例子: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)對於某些元素,例如文本,隱式高度取決於(非隱式)寬度。
2)隱含大小通常取決於其子女的隱含大小。

+2

簡而言之:隱含大小是對象想要佔用的空間,大小是它實際佔用的空間。 – Felix

+1

請注意,對於「文本」,如果沒有包裝,「隱含寬度」是文本佔用的寬度。 contentWidth是Item包含的實際寬度(如果沒有包裝,它等於'implicitWidth')。 – GrecKo

+1

我認爲這也是我的理解。因此,簡而言之,使用隱式維度「預設」組件的維度,並在想要「覆蓋」該維度時使用常規維度。如果未設置常規寬度/高度,則隱式維度就類似於回退值。我在這裏有意義嗎? – Silex