0

问题陈述

当项目的祖先的不透明度为 0 时,我可以渲染项目吗?


动机

这个问题的动机是我的另一个问题(我称之为“隐藏纹理源”问题)。请注意,目前我使用的是opacity: 0而不是visible: false,但这会导致与链接问题相同的问题。

我隐藏物品的原因是这个

有一次,我只是直接剔除需要用作纹理源的每个项目。所以隐藏纹理源问题的修复很简单:(简化伪代码)

texSourceItem.opacity = 1;
cppItem.update(); // QQuickFramebufferObject
texSourceItem.opacity = 0; // reset back to 0

但现在我也在剔除整个Rows 这样的项目。而且由于不透明度是继承的,如果我想更新 cppItem,我必须为整个 parent 做 unhide-hide dance Row。然后,两个纹理源项目可能会发生具有互锁时序的取消隐藏过程,因此为了避免错误,我必须保留一个自定义引用计数器,该计数器知道当前正在更新多少 cppItems。这对我来说太复杂了。因此,回答我的问题将是有益的。

4

1 回答 1

0

文档中引用:

设置此属性时,指定的不透明度也将单独应用于子项。在某些情况下,这可能会产生意想不到的影响。例如,在下面的第二组矩形中,红色矩形指定的不透明度为 0.5,这会影响其蓝色子矩形的不透明度,即使子矩形没有指定不透明度。

但你可能知道这一点。

我不完全了解您的情况到底是什么,但我能看到的唯一解决方案是让Items不是透明的后代Item,而是它的兄弟姐妹。

当然,你不能锚定到Items (grand)*child,但你仍然可以映射它们的位置。(不过要小心这个问题mapTo/FromItem(),如果位置发生变化,更新可能会很复杂)

如果我们有例如这种情况:

Rectangle {
    id: rect1
    color: 'red'
    anchors.fill: parent

    Rectangle {
        id: rect2

        width: 200
        height: 200
        color: 'blue'
        anchors.centerIn: parent
        Rectangle {
            id: rect3
            width: 50
            height: 50
            color: 'green'
            anchors.centerIn: parent
        }
    }

    MouseArea {
        anchors.fill: parent
        onClicked: parent.opacity = !parent.opacity
    }
}

但是我们想继续渲染rect2我们可以这样做:

ShaderEffectSource {
    sourceItem: rect2
    sourceRect: Qt.rect(-rect2.x, -rect2.y, rect1.width, rect1.height)
    anchors.fill: rect1
}

因为rect3它变得不方便,因为我们现在需要跟踪相对位置。(要让它动态,请参阅之前发布的链接)

ShaderEffectSource {
    sourceItem: rect3
    sourceRect: Qt.rect(-rect2.x - rect3.x, -rect2.y - rect3.y, rect1.width, rect1.height) // keep track of all positions -.-
    anchors.fill: rect1
}
于 2017-05-04T20:54:45.047 回答