QML Opacity Inheritance

前端 未结 9 1934
刺人心
刺人心 2020-12-31 04:12

In QML, how can I prevent a child element from inheriting the opacity from its parent? I want to set different opacity values for the parent and it\'s child element.

相关标签:
9条回答
  • 2020-12-31 04:23

    I don't think its possible. you have to make two element sibling and changes its opacity as you wish.

    0 讨论(0)
  • 2020-12-31 04:24

    I've bumped into this issue just now. Using Qt 5.1.0

    In my case, I had a Rectangle Element with opacity: 0.6 and a child Image element. The Image was inheriting the transparency - not desired.

    To solve it, I enclosed the main Rectangle in an Item element. Passed the size/position definitions from the Rectangle to the outer Item. Moved the Image outside the Rectangle.

    In the end, I had Item as the main parent and Rectangle and Image side by side, inside Item.

    Only Rectangle maintained the opacity 0.6, so the Rectangle has transparency and Image is fully opaque.

    0 讨论(0)
  • 2020-12-31 04:34

    it is not possible to do that but you can change their color with

    Qt.lighter(color,opacity)

    for example

    Rectangle {
      color: Qt.lighter("red",.5)
      width: 200; height: 100
    
      Rectangle {
        color: Qt.lighter("blue",1)
        width: 100; height: 100
      }
    }
    
    0 讨论(0)
  • 2020-12-31 04:36

    I think, one way would be to use semi transparent colors as described here instead of opacity.

    e.g. using quad color code like #800000FF for semi transparent blue.

    0 讨论(0)
  • 2020-12-31 04:37

    I also ran into this problem with Qt 4.8.6.

    In my particular case, I wanted the top level item to be 20% transparent with black color, but have its child elements be unaffected by any opacity/transparency setting from the parent.

    Opacity did not work, due to the inheritance mechanism of QML.

    But I was able to use the rgba function from the Qml Qt object. This allowed me to get exactly what I wanted, the parent is now 20% transparent, but the child elements are unaffected.

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

    Note: I also tried to use the RGBA color codes directly, as mentioned by a previous poster, but it did not work.

    Example:

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

    Setting the alpha value for any other RGBA values worked, just not with pure black.

    0 讨论(0)
  • 2020-12-31 04:46

    It's possible! You need to test in the Component.onCompleted scope the opacity of the parent. If its 0 you need to change the parent of your object to the parent of it's current parent.

    Example:

    Item{
        id:root
    
        Item{
            id:currentParent
            opacity: 0
            Item{
                id:item
                Component.onCompleted:{
                    if(parent.opacity === 0)
                        item.parent = currentParent.parent
                }
            }
        }
    }
    
    0 讨论(0)
提交回复
热议问题