【问题标题】:Can I make an item be rendered when an ancestor of it has opacity 0?当项目的祖先的不透明度为 0 时,我可以渲染项目吗?
【发布时间】:2017-05-04 18:40:14
【问题描述】:

问题陈述

我可以让一个项目在其祖先的不透明度为 0 时呈现吗?


动机

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

我隐藏项目的原因是this。

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

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

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

【问题讨论】:

    标签: qt qml transparency qtquick2 culling


    【解决方案1】:

    引用documentation:

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

    但你可能知道。

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

    当然,你不能锚定到Items (grand)*child,但你仍然可以映射它们的位置。 (不过要小心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
    }
    

    【讨论】:

    • Re: ShaderEffectSource 解决方案:你试过了吗?我很确定当rect1` 有opacity:0 时,ShaderEffectSource 不能将它(或其子项)用作源项。好吧,您不会收到错误消息/崩溃,但在 ShaderEffectSource 中没有呈现任何内容。回复:使项目成为兄弟:这在我的情况下不起作用,因为我确实想要不透明度继承,我只是不希望它在更新 cppItem 期间应用。
    猜你喜欢
    • 2018-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-17
    • 2019-08-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多