2017-07-03 554 views
0

我已啓用材質設計(黑色主題)。更改ItemDelegate的背景和文本顏色

一些教程告訴我使用背景屬性來設置自定義顏色的矩形項目。就像這個截圖:

Should later look like this

但是使用這個技術我沒有這些漂亮的連鎖反應了。我只想改變所有項目的背景和文字顏色。

所以我試着改變背景propertys沒有運氣。在啓動時,調試輸出告訴我在後臺沒有顏色屬性。

所以我想出了一個使用綁定的「哈克」方法......現在屬性存在!?

這是完成我的目標的最佳方式嗎?點擊時會出現漣漪效應,但我對此沒有很好的感覺。我不明白爲什麼該屬性存在使用綁定時,爲什麼他們不存在使用正常的數據綁定。

ItemDelegate { 
    width: ListView.view.width 
    height: contentItem.implicitHeight + 10 

    topPadding: 5 
    bottomPadding: 5 

    highlighted: ListView.view.currentIndex === model.index 

    //background.color: highlighted ? "#81A3CF" : "#B3B2B2" 
    Binding { 
     target: background 
     property: "color" 
     value: highlighted ? "#81A3CF" : "#B3B2B2" 
    } 

    text: model.index + (highlighted ? " [highlighted]" : "") 

    //contentItem.color: "black" 
    Binding { 
     target: contentItem 
     property: "color" 
     value: "black" 
    } 

    onClicked: { 
     if(ListView.view.currentIndex === model.index) 
      ListView.view.currentIndex = -1; 
     else 
      ListView.view.currentIndex = model.index 
    } 
} 

回答

1

原因很簡單:

background聲明爲Item - 和Item沒有color,所以你不能改變它,它被分配一個具體Item具有color之前。因此,當您執行QML文件時,Rectangle尚不可用,直到創建完成爲止。這是當Binding將設置顏色。

如果你不需要它綁定到任何東西,另一種解決方案是使用:

Component.onCompleted: background.color = 'green' 

否則,我認爲在Binding -trick要罰款(但這意見!)

+0

好的,所以我會留在綁定爲我的背景,因爲它取決於突出顯示。我非常難過,我自己實施了這些基本的東西,比如突出顯示的方式和onClicked事件。我絕對認爲這樣的事情應該留在圖書館裏。 –

0

我不確定你爲什麼改變你的物品代表的背景顏色。在視覺上突出顯示ListView中選定項目的常規方法是創建一個組件(通常使用矩形)並將其分配給ListView的高亮屬性,然後將ListView的highlightFollowsCurrentItem設置爲true。當currentIndex更改時,ListView將隱藏並顯示適當的高亮組件,並且如果需要,您可以指定各種過渡效果。

+0

如果我的物品也有背景顏色,該怎麼辦?高亮矩形不會隱藏在項目下方嗎? –

+0

是的,我相信會的。你的所有物品都具有相同的背景顏色還是不同?我一直使用ListView大小的矩形作爲ListView的子項,以提供列表的背景,在這種情況下,高亮矩形出現在背景上方。但是如果你需要不同顏色的行,那就行不通了。 – WaltPurvis