2012-02-09 165 views
13

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

回答

2

我不认为它是可能的。你必须做出两个元素兄弟姐妹,并随意改变其不透明度。

10

你不能。项目不透明度值相对于他们的父母,所以如果你喜欢

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

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

代码的东西你会看到两个矩形具有相同的不透明度。

+0

看到能证实这种行为。坦率地说,我看不出有这样一种选择的理由,我怀疑这是一个错误。 – Avio 2013-06-06 09:16:29

+2

我不认为这是一个错误。它与许多常见属性(例如:x,y,z)的形式相同。它允许你不使用绝对引用来安排每个项目。 – 2013-06-10 07:37:17

+0

我试图打开一个针对QtQml的错误,它已经在几分钟内关闭了,所以看起来Qt的人们有着同样的观点。但我仍然对这件事持怀疑态度。如果我写了一行代码,我不希望它首先被忽略,其次,如果它被忽略,我想警告我的代码没有效果。但是,我再次看不到一个原因,如果一个元素块的不透明度为0.5,我不能仅仅使其中一个具有不透明度1.如果它们在逻辑上被分组为主容器的子元素,为什么应该我只是其中一个兄弟姐妹? – Avio 2013-06-10 07:58:45

7

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

例如使用类似于#800000FF的四色码用于半透明蓝色。

+0

如果你可以直接分配一个单一的颜色(不是一个复合材料项目,而不是一个图像),这个解决方案是完美的 – jdo 2013-07-09 13:45:55

5

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

在我的情况下,我有一个Rectangle元素opacity: 0.6和子元素Image元素。 Image正在继承透明度 - 不需要。

为了解决它,我在Item元件包围的主Rectangle。将尺寸/位置定义从Rectangle传递到外部Item。在Rectangle之外移动Image

最后,我有Item作为主要亲本,并且RectangleImage并排,在Item里面。

只有Rectangle保持不透明度0.6,所以矩形具有透明度,Image是完全不透明的。

11

实际上,为父元素设置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' 
    } 
} 

这是一个解决方案,但要确保你知道让层次感,当你在做什么。

另一个可能的解决方案是使用shadereffect。

感谢peppe#qt @ freenode。

0

我也遇到了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阿尔法值的工作,只是不能与纯黑色。

+0

颜色属性在QML中是ARGB,而不是RGBA,把你的颜色改为'#FA000000',它会起作用 – mchiasson 2015-10-23 12:16:45

+0

你说得对,也许是因为我之前和Qt.rgba(..)一起工作,颜色类型使用相同格式的时间。 – ManuelH 2015-10-23 13:18:31

4

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

例子:

Item{ 
    id:root 

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

有趣的...... :-) – mchiasson 2016-01-15 15:44:46

2

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

我个人的解决办法是改变这种:

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 
    } 
} 
0

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

Qt.lighter(color,opacity)

例如

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

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