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

时间:2017-05-04 18:40:15

标签: qt qml transparency qtquick2 culling

问题陈述

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

动机

这个问题的动机是other question of mine(我将其称为" hidden-texture-source"问题)。请注意,目前我使用opacity: 0而不是visible: false,但这会导致与链接问题相同的问题。

我隐藏项目的原因是this

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

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

但现在我还要剔除这些物品的全部Row个。由于不透明是继承的,如果我想更新cppItem,我必须为整个父Row做隐藏式舞蹈。然后,两个纹理源项可能发生在具有互锁定时的取消隐藏过程中,因此为了避免错误,我必须保留一个自定义引用计数器,该计数器知道当前正在更新多少个cppItem。这对我来说太复杂了解决方案。所以我的问题的答案将是有益的。

1 个答案:

答案 0 :(得分:0)

引用documentation

  

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

但你可能知道这一点。

我并不完全明白您的情况究竟是什么,但我能看到的唯一解决方案是让Item成为没有后代的透明{ {1}}而是它的兄弟姐妹。

当然,您无法锚定Item s(grand)*孩子,但您仍可以映射他们的位置。 (但要注意issue,如果位置发生变化,Item可能很难更新。

如果我们有这样的情况:

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