更改 ItemDelegate 的背景和文本颜色
Changing background and text color of a ItemDelegate
我启用了 material 设计(深色主题)。
一些教程告诉我使用背景 属性 来设置我自己的具有自定义颜色的矩形项目。就像这个截图:
但是使用这种技术我不再有这些漂亮的涟漪效应了。我只想更改所有项目的背景和文本颜色。
所以我尝试更改 属性 的背景,但没有成功。启动时,调试输出告诉我背景中没有颜色 属性。
所以我想出了一个 "hacky" 使用绑定的方法...现在属性存在了!?
这是实现我的目标的最佳方式吗?单击时会出现涟漪效应,但我对此感觉不太好。我不明白为什么 属性 在使用绑定时存在,而在使用普通数据绑定时为什么不存在。
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
}
}
原因很简单:
background
被声明为 Item
- 而 Item
没有 color
,所以你不能改变它,在它被分配一个具体的 Item
有一个 color
。因此,当您执行 QML
文件时,Rectangle
尚不可用,直到所有内容都创建完毕。这是 Binding
设置颜色的时候。
如果你不需要它绑定到任何东西,另一个解决方案是使用:
Component.onCompleted: background.color = 'green'
否则,我认为 Binding
-trick 没问题(但这是个人意见!)
我不确定您为什么要更改项目委托的背景颜色。在 ListView 中可视化高亮选中项的正常方法是创建一个组件(通常使用矩形)并将其分配给 ListView 的高亮 属性,然后将 ListView 的 highlightFollowsCurrentItem 设置为 true。 ListView会在currentIndex发生变化时,适时隐藏和显示高亮组件,您可以根据需要指定各种过渡效果。
我启用了 material 设计(深色主题)。
一些教程告诉我使用背景 属性 来设置我自己的具有自定义颜色的矩形项目。就像这个截图:
但是使用这种技术我不再有这些漂亮的涟漪效应了。我只想更改所有项目的背景和文本颜色。
所以我尝试更改 属性 的背景,但没有成功。启动时,调试输出告诉我背景中没有颜色 属性。
所以我想出了一个 "hacky" 使用绑定的方法...现在属性存在了!?
这是实现我的目标的最佳方式吗?单击时会出现涟漪效应,但我对此感觉不太好。我不明白为什么 属性 在使用绑定时存在,而在使用普通数据绑定时为什么不存在。
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
}
}
原因很简单:
background
被声明为 Item
- 而 Item
没有 color
,所以你不能改变它,在它被分配一个具体的 Item
有一个 color
。因此,当您执行 QML
文件时,Rectangle
尚不可用,直到所有内容都创建完毕。这是 Binding
设置颜色的时候。
如果你不需要它绑定到任何东西,另一个解决方案是使用:
Component.onCompleted: background.color = 'green'
否则,我认为 Binding
-trick 没问题(但这是个人意见!)
我不确定您为什么要更改项目委托的背景颜色。在 ListView 中可视化高亮选中项的正常方法是创建一个组件(通常使用矩形)并将其分配给 ListView 的高亮 属性,然后将 ListView 的 highlightFollowsCurrentItem 设置为 true。 ListView会在currentIndex发生变化时,适时隐藏和显示高亮组件,您可以根据需要指定各种过渡效果。