Qt 当某个项目的祖先不透明度为0时,是否可以使其进行渲染? 问题陈述

Qt 当某个项目的祖先不透明度为0时,是否可以使其进行渲染? 问题陈述,qt,qml,transparency,qtquick2,culling,Qt,Qml,Transparency,Qtquick2,Culling,当某个项目的祖先不透明度为0时,我是否可以使其渲染? 动机 这个问题的动机是这样的(我称之为“隐藏纹理源”问题)。请注意,目前我使用的是opacity:0,而不是visible:false,但这会导致与链接问题相同的问题 我隐藏物品的原因是 有一次,我只是直接剔除每个需要用作纹理源的项目。因此,隐藏纹理源问题的解决方法很简单:(简化的伪代码) 但现在我也在剔除这类项目的整个行。由于不透明度是继承的,如果我想更新cppItem,我必须对整个父行执行取消隐藏隐藏操作。然后,可能会发生两个纹理源项通

当某个项目的祖先不透明度为0时,我是否可以使其渲染?


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

我隐藏物品的原因是

有一次,我只是直接剔除每个需要用作纹理源的项目。因此,隐藏纹理源问题的解决方法很简单:(简化的伪代码)

但现在我也在剔除这类项目的整个
行。由于不透明度是继承的,如果我想更新cppItem,我必须对整个父行执行取消隐藏隐藏操作。然后,可能会发生两个纹理源项通过联锁计时执行取消隐藏隐藏过程的情况,因此为了避免出现错误,我必须保留一个自定义引用计数器,该计数器知道当前有多少个纹理源项正在更新。这对我来说太复杂了。因此,回答我的问题将是有益的。

引自:

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

但你可能知道

我不完全理解您的具体情况,但我能看到的唯一解决方案是使
s不是透明
的后代,而是它的兄弟

当然,您不能锚定到
s(grand)*子项,但仍然可以映射它们的位置。(不过要小心,如果位置发生变化,
mapTo/fromtime()
可能会很难更新)

如果出现这种情况,例如:

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解决方案:您尝试过吗?我很确定当
rect
1`具有
opacity:0
时,ShaderEffectSource不能将其(或其子项)用作sourceItem。当然,您不会收到错误消息/崩溃,但ShaderEffectSource中不会渲染任何内容。Re:使项目成为同级:这在我的情况下不起作用,因为我确实想要不透明度继承,我只是不希望它在cppItem更新期间应用。
ShaderEffectSource {
    sourceItem: rect2
    sourceRect: Qt.rect(-rect2.x, -rect2.y, rect1.width, rect1.height)
    anchors.fill: rect1
}
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
}