如何在 QML 的 Repeater Delegate 上应用 Qt Graphical Effect

How to apply Qt Graphical Effect on Delegate of Repeater in QML

我想将 QtGraphicalEffect ColorOverlay 应用到 Repeater 委托中的 Image。问题是我必须将 Imageid 设置为 ColorOverlaysource,但我不知道 id,因为它由 Repeater.

动态创建
import QtQuick 2.4
import QtGraphicalEffects 1.0

Item {
    id:mainItem
    width: 800
    height: 400

    property string vorneColor: "red"

    ListModel {
        id: safeRailModel
        ListElement {name: "vorne"; imageSource:"images/saferail/ring_vorne.png";}
        ListElement {name: "vorneLinks"; imageSource:"images/saferail/ring_vorne_links.png"; }
    }

    Component {
        id: imageDelegate
        Image {
            source: imageSource
            anchors.horizontalCenter: parent.horizontalCenter
            anchors.bottom: parent.bottom
            fillMode: Image.PreserveAspectFit
            opacity: 1
            visible: true
        }
    }

    Repeater {
        id: safeRailRepeater
        model: safeRailModel
        delegate: imageDelegate
    }

    Component {
        id: effectsDelegate
        Item{
            id:effectsItem
            ColorOverlay {
                anchors.fill: safeRailRepeater.itemAt(index)// <-- This doesn't work
                source: safeRailRepeater.itemAt(index)// <-- This doesn't work
                color: vorneColor
            }
        }
    }

    Repeater {
        id: safeRailEffectsRepeater
        model: safeRailModel
        delegate: effectsDelegate
    }
}

如何设置 sourceanchors.fill 属性?

我到处搜索,但只找到了 safeRailRepeater.itemAt(index)safeRailRepeater.itemAt(index).item 的内容,但前者和后者都不起作用。

旁注:ColorOverlay 不需要在单独的委托和 Repeater 中。

如果有人能解决这个问题或者能给我指出正确的方向,那就太好了。

非常感谢!

问题是 itemAt() 函数调用 returns null 因为另一个 Repeater 还没有加载它的项目。此外,函数调用永远不会被重新计算,因为它的参数 none 会改变,所以你总是会得到 null.

虽然设计有点奇怪;我建议将 ColorOverlay 移动到同一个委托中,正如您提到的那样,它不必位于单独的 Repeater:

import QtQuick 2.0
import QtQuick.Window 2.0
import QtGraphicalEffects 1.0

Window {
    id: mainItem
    width: 800
    height: 400
    visible: true

    property string vorneColor: "red"

    ListModel {
        id: safeRailModel
        ListElement { name: "vorne"; vorneColor: "salmon"; }
        ListElement { name: "vorneLinks"; vorneColor: "steelblue"; }
    }
    Component {
        id: imageDelegateComponent
        Rectangle {
            id: delegate
            color: "grey"
            opacity: 1
            visible: true
            width: 64
            height: 64

            layer.enabled: true
            layer.effect: ColorOverlay {
                color: vorneColor
            }
        }
    }
    Row {
        anchors.horizontalCenter: parent.horizontalCenter
        anchors.bottom: parent.bottom

        Repeater {
            id: safeRailRepeater
            model: safeRailModel
            delegate: imageDelegateComponent
        }
    }
}

使用 Itemlayer API 是指定图形效果的便捷方式。

我也把Image改成了Rectangle,因为我们看不到那些图片,把Repeater放在一行里,这样你就可以看到了所有代表。