更改 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发生变化时,适时隐藏和显示高亮组件,您可以根据需要指定各种过渡效果。