Qt 更改ItemDelegate的背景和文本颜色

Qt 更改ItemDelegate的背景和文本颜色,qt,qml,qtquick2,qtquickcontrols2,Qt,Qml,Qtquick2,Qtquickcontrols2,我启用了材质设计(黑色主题) 一些教程告诉我使用background属性来设置我自己的带有自定义颜色的矩形项。如以下截图所示: 但是使用这种技术,我不再有这些好的涟漪效应了。我想做的就是更改所有项目的背景和文本颜色 所以我试着在没有运气的情况下改变背景的属性。在启动时,调试输出告诉我背景中没有颜色属性 所以我想出了一个使用绑定的“黑客”方法。。。现在属性存在了 这是实现我目标的最好方法吗?点击时会出现连锁反应,但我对此感觉不太好。我不明白为什么在使用绑定时属性存在,为什么在使用普通数据绑定时属

我启用了材质设计(黑色主题)

一些教程告诉我使用background属性来设置我自己的带有自定义颜色的矩形项。如以下截图所示:

但是使用这种技术,我不再有这些好的涟漪效应了。我想做的就是更改所有项目的背景和文本颜色

所以我试着在没有运气的情况下改变背景的属性。在启动时,调试输出告诉我背景中没有颜色属性

所以我想出了一个使用绑定的“黑客”方法。。。现在属性存在了

这是实现我目标的最好方法吗?点击时会出现连锁反应,但我对此感觉不太好。我不明白为什么在使用绑定时属性存在,为什么在使用普通数据绑定时属性不存在

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
    }
}
原因很简单:

背景
被声明为
,并且
没有
颜色
,因此在为其分配具有
颜色
的具体
项之前,您无法对其进行更改。因此,当您执行
QML
-文件时,
矩形
在创建所有内容之前不可用。此时,
绑定将设置颜色

如果您不需要将其绑定到任何内容,另一种解决方案是使用:

Component.onCompleted: background.color = 'green'

否则,我认为
绑定
-技巧很好(但这是观点!)

我不确定您为什么要更改项目代理的背景色。在ListView中以视觉方式高亮显示选定项的通常方法是创建一个组件(通常使用矩形)并将其指定给ListView的highlight属性,然后将ListView的HighlightFollowCurrentItem设置为true。当currentIndex更改时,ListView将根据需要隐藏和显示高亮显示组件,如果需要,您可以指定各种过渡效果。

Ah ok,因此我将保留我的背景绑定,因为它取决于高亮显示。我很难过,我自己实现了这些基本的东西,比如突出显示的意思和onClicked事件。我肯定认为这些东西应该留在图书馆里。如果我的物品也有背景色呢?高光矩形不会隐藏在项目下面吗?是的,我相信会。您所有的物品背景颜色相同还是不同?我一直使用一个与ListView大小相同的矩形作为ListView的子对象来提供列表的背景,在这种情况下,高亮显示的矩形显示在背景上方。但是如果您需要不同颜色的行,这将不起作用。