更改ItemDelegate的背景和文本颜色

时间:2017-07-03 15:26:39

标签: qt qml qtquick2 qtquickcontrols2

我启用了材料设计(黑暗主题)。

一些教程告诉我使用background属性来设置我自己的自定义颜色的Rectangle项。就像在这个截图中一样:

Should later look like this

但是使用这种技术我不再具有这些漂亮的涟漪效应了。我想做的只是改变所有项目的背景和文字颜色。

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

所以我想出了一个使用Bindings的“hacky”方法......现在属性存在了!?

这是实现目标的最佳方式吗?点击时会出现涟漪效应,但我对此并没有很好的感觉。我不明白为什么在使用Bindings时属性存在以及为什么它们在使用普通数据绑定时不存在。

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
    }
}

2 个答案:

答案 0 :(得分:1)

原因很简单:

background被声明为Item - 而Item没有color,所以在分配具体Item之前,您无法更改它}有一个color。因此,当您执行QML - 文件时,Rectangle尚未可用,直到创建完所有内容。这是Binding将设置颜色的时间。

如果你不需要它绑定任何东西,另一个解决方案是使用:

Component.onCompleted: background.color = 'green'

否则,我认为Binding - 技巧很好(但这是意见!

答案 1 :(得分:0)

我不确定您为什么要更改商品代表的背景颜色。在ListView中直观地突出显示所选项目的常规方法是创建一个组件(通常使用矩形)并将其分配给ListView的高亮属性,然后将ListView的highlightFollowsCurrentItem设置为true。当currentIndex更改时,ListView将隐藏并显示高亮组件,如果需要,您可以指定各种过渡效果。