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

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

【问题讨论】:

    标签: opacity 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。

        【讨论】:

        【解决方案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
              }
            }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-04-08
              • 2011-02-07
              • 2018-08-16
              • 2012-04-21
              • 1970-01-01
              • 2014-01-31
              相关资源
              最近更新 更多