QML 不透明度继承

Posted

技术标签:

【中文标题】QML 不透明度继承【英文标题】:QML Opacity Inheritance 【发布时间】:2012-03-01 12:46:00 【问题描述】:

在 QML 中,如何防止子元素从其父元素继承不透明度? 我想为父元素和它的子元素设置不同的不透明度值。

【问题讨论】:

【参考方案1】:

我认为这是不可能的。您必须使两个元素同级并根据需要更改其不透明度。

【讨论】:

【参考方案2】:

你不能。项目的不透明度值是相对于他们的父母的,所以如果你编写类似的代码

Rectangle 
  color: "red"
  opacity: 0.5
  width: 200; height: 100

  Rectangle 
    color: "blue"
    opacity: 1
    width: 100; height: 100
  

您会看到两个矩形具有相同的不透明度。

【讨论】:

我现在可以确认这种行为。坦率地说,我看不出做出这种选择的原因,我怀疑这是一个错误。 我不认为这是一个错误。它与许多常见属性(例如:x、y、z)相同。它允许您不使用绝对引用来排列每个项目。 我试图打开一个针对 QtQml 的错误,它已在几分钟内关闭,所以 Qt 人似乎和你的意见相同。但我仍然对这件事持怀疑态度。如果我写了一行代码,首先我不希望它被忽略,其次如果它必须被忽略,我想被警告我的代码没有效果。但是,再一次,我看不出为什么,如果一个元素块的不透明度为 0.5,我不能只让其中一个元素的不透明度为 1。如果它们在逻辑上被分组为主容器的子容器,为什么应该我只让其中一个成为兄弟姐妹? 如果您将一组项目的不透明度设置为 0.5,这对我(以及 Qt 人员)意味着您希望将该值设置为该组中的所有项目。否则,您应该将此值设置为您想要的项目。 是的......这就是不透明度在场景图中通常的工作方式:节点的不透明度是节点的本地不透明度乘以它的祖先,不透明度。因此,如果父项的局部不透明度为 0.5,子项的局部不透明度为 1.0,则子项的最终不透明度将为父项的不透明度 (0.5) x 子项的局部不透明度 (1.0) = 0.5。但是,我希望将不透明度值设置为 2.0 会起作用,因为 0.5 * 2.0 = 1.0。我试过了,不幸的是它没有用。看起来 Qt 将不透明度值限制在 0 .. 1 之间太快了...... :(【参考方案3】:

我认为,一种方法是使用here 所述的半透明颜色,而不是不透明度。

例如使用像 #800000FF 这样的四色代码来表示半透明的蓝色。

【讨论】:

如果可以直接指定单一颜色(不是复合项也不是图像),这个方案就完美了。 谢谢,这解决了我的问题。我实际上只是设置了#00000000,而且效果很好。 为了强调,透明度数字是前两位数字。可以在此图表中找到不同的 alpha 值:gist.github.com/lopspower/03fb1cc0ac9f32ef38f4【参考方案4】:

我刚才碰到了这个问题。使用 Qt 5.1.0

在我的例子中,我有一个 Rectangle 元素与 opacity: 0.6 和一个子 Image 元素。 Image 继承了透明度 - 不需要。

为了解决这个问题,我将主要的 Rectangle 包含在一个 Item 元素中。将大小/位置定义从Rectangle 传递到外部Item。将Image 移到Rectangle 之外。

最后,我将 Item 作为主要父级,RectangleImage 并排在 Item 内部。

只有 Rectangle 保持不透明度 0.6,因此 Rectangle 具有透明度,Image 完全不透明。

【讨论】:

【参考方案5】:

实际上,为父元素设置layer.enabled: true 对我来说是这样的。 整个元素被渲染到缓冲区,opacity 被应用到生成的缓冲区(一次应用到整个层)。

见http://doc.qt.io/qt-5/qml-qtquick-item.html#layer.enabled-prop

示例代码:

Rectangle 
    width: 400
    height: 200
    opacity: 0.5
    layer.enabled: true
    Rectangle 
            width: parent.width
            height: parent.height
            color: 'red'
    
    Rectangle 
            width: parent.width / 2
            height: parent.height
            color: 'blue'
    

这是一个解决方案,但请确保在启用分层时知道自己在做什么。

另一种可能的解决方案是使用着色器效果。

感谢 #qt@freenode 上的 peppe。

【讨论】:

不! 'layer.enabled' 不会这样做 Layer Opacity vs Item Opacity。所以layers.enabled 逐项控制 alpha 混合【参考方案6】:

我在 Qt 4.8.6 中也遇到过这个问题。

在我的特定情况下,我希望***项目是 20% 透明的黑色,但其子元素不受父项的任何不透明度/透明度设置的影响。

由于 QML 的继承机制,不透明度不起作用。

但我能够使用 Qml Qt 对象中的 rgba 函数。这让我得到了我想要的东西,父元素现在是 20% 透明的,但子元素不受影响。

Rectangle 
    width: 400
    height: 400
    color: Qt.rgba(0, 0, 0, 0.2) // Works perfectly, pure black with 20% transparency, equal to 0.2 opacity

    // Unaffacted child elements here...

注意:我也尝试过直接使用 RGBA 颜色代码,如之前的海报所述,但它不起作用。

例子:

color: "#000000FA" // Supposed to be semi transparent, but always transparent, regardless of the alpha value

为任何其他 RGBA 值设置 alpha 值都有效,只是不适用于纯黑色。

【讨论】:

QML 中的颜色属性是 ARGB,而不是 RGBA。将您的颜色更改为#FA000000,它将起作用。 你是对的。也许是因为我之前使用的是 Qt.rgba(..),所以当时我一直在想颜色类型使用相同的格式。【参考方案7】:

有可能!您需要在Component.onCompleted 范围内测试父级的不透明度。如果它为 0,则需要将对象的父级更改为其当前父级的父级。

例子:

Item
    id:root

    Item
        id:currentParent
        opacity: 0
        Item
            id:item
            Component.onCompleted:
                if(parent.opacity === 0)
                    item.parent = currentParent.parent
            
        
    

【讨论】:

【参考方案8】:

您不能阻止子元素从其父元素继承不透明度。

我个人的工作是改变这个:

Rectangle 
    color: "red"
    opacity: 0.5
    width: 200; height: 100

    Rectangle 
        color: "blue"
        opacity: 1
        width: 100; height: 100
    

进入这个:

Item 
    width: 200; height: 100

    Rectangle 
        anchors.fill: parent
        color: "red"
        opacity: 0.5
    

    Rectangle 
        color: "blue"
        opacity: 1
        width: 100; height: 100
    


或者这个(只有当父级是纯色时才有可能):

Rectangle 
    color: "#7FFF0000" // 50% transparent red
    opacity: 0.5
    width: 200; height: 100

    Rectangle 
        color: "blue"
        opacity: 1
        width: 100; height: 100
    

【讨论】:

【参考方案9】:

这是不可能的,但你可以改变它们的颜色

Qt.lighter(color,opacity)

例如

Rectangle 
  color: Qt.lighter("red",.5)
  width: 200; height: 100

  Rectangle 
    color: Qt.lighter("blue",1)
    width: 100; height: 100
  

【讨论】:

以上是关于QML 不透明度继承的主要内容,如果未能解决你的问题,请参考以下文章

QML - 在重叠的 Text 和 TextArea 之间动态交换可见性/不透明度

QML ListView 填充不透明动画

QQuickWidget+QML设置背景透明

Qml 半透明模糊叠加矩形

QT 5.7 QML 快速半透明矩形,一侧有圆角

如何在 QML 中使用透明矩形隐藏图像?