2017-05-04 37 views
0

问题陈述

我可以当它的一个祖先具有不透明度为0的项目呈现?当我的祖先拥有不透明度0时,我可以让它呈现吗?


动机

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

我隐藏物品的原因是this

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

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

但是现在我还扑杀整个 S,从而物品。由于不透明是继承的,如果我想更新cppItem,我必须为整个父母做隐藏舞蹈。然后,可能会发生两个纹理源项目以互锁定时执行隐藏隐藏过程,为了避免错误,我必须保留一个自定义引用计数器,以知道当前正在更新多少个cppItems。这对我来说太复杂了。所以我的问题的答案将是有益的。

回答

0

要从documentation引用:

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

但你可能知道这一点。

我不完全了解你的情况到底是,但我可以看到的唯一的解决办法,是让Item使他能没有透明Item的后裔而是它的兄弟姐妹来代替。

当然,那么你不能锚定到Item s(大)*孩子,但你仍然可以映射他们的位置。如果我们EG(注意与issue虽然,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 
} 
+0

回复:ShaderEffectSource解决方案:你试过了吗?我非常肯定,当'rect'1'具有'opacity:0'时,ShaderEffectSource不能使用它(或其子项)作为sourceItem。那么,您不会收到错误消息/崩溃,但ShaderEffectSource中不会显示任何内容。 Re:使这个项目成为兄弟姐妹:这对我来说不起作用,因为我确实需要不透明度继承,我只是不希望它在更新cppItem的时候应用。 –

+0

我已经尝试过了,对于我来说就像发布一样。 – derM

相关问题