项目后面的 QML Shader Effect 模糊

QML Shader Effect blur behind an item

是否可以对位于另一个项目后面的项目进行模糊处理?

示例:模糊图像的一部分(如在 qml 中 - parent.centerIn:图像)

我想要这样的东西:

Image { id: img
    anchors.fill: parent
    source: "bug.png"

    Item { id: info
        anchors.centerIn: parent
        height: 200
        width: 200

        Text {
            text: "HAMMER TIME"
            color: "white"
        }

        /* BLUR CODE HERE TO BLUR BACKGROUND OF THIS ITEM */
        /* which is a part of "bug.png" image with 200x200 size */
        /* and offset equals to "info.x" and "info.y" */
    }
}

这个问题会影响任何 shader effect 因为官方文档没有这个问题的答案而且我的所有尝试都没有成功 - 只能模糊 WHOLE ITEM但不是其中的一部分。

不是最漂亮的解决方案,但恐怕没有这样的 Qml 机制。
您可以在您的图片上应用具有相同来源的第二张图片,并根据您的需要对其进行剪辑,如下所示:

Image {
    id: img
    anchors.fill: parent
    source: "bug.png"

    Item { id: info
        anchors.centerIn: parent
        height: 200
        width: 200

    Text {
        text: "HAMMER TIME"
        color: "white"
    }

    /* BLUR CODE HERE TO BLUR BACKGROUND OF THIS ITEM */
    /* which is a part of "bug.png" image with 200x200 size */
    /* and offset equals to "info.x" and "info.y" */

    clip:true
    Image {
        id: img2
        x: -info.x
        y: -info.y
        width: img.width
        height: img.height
        source: img.source
    }
    FastBlur {
        anchors.fill: img2
        source: img2
        radius: 32
    }
}

这是我的解决方案。此版本仅适用于矩形。 Item ShaderEffectSource 有助于创建这样的源矩形。

import QtQuick 2.3
import QtQuick.Window 2.2
import QtGraphicalEffects 1.0

Window {
    visible: true
    width: 600
    height:600

    Image {
        id: image_bug

        anchors.fill: parent
        source: "images/Original_bug.png"
    }

    ShaderEffectSource {
        id: effectSource

        sourceItem: image_bug
        anchors.centerIn: image_bug
        width: 400
        height: 400
        sourceRect: Qt.rect(x,y, width, height)
    }

    FastBlur{
        id: blur
        anchors.fill: effectSource

        source: effectSource
        radius: 100
    }
}

如果你需要其他形状,我想你可能需要应用一个mask-shader,先剪掉相关部分,然后再应用模糊。