Наследование непрозрачности QML

В QML, как я могу предотвратить дочерний элемент от наследования непрозрачности от своего родителя? Я хочу установить разные значения непрозрачности для родительского и дочернего элементов.


person aqua boy    schedule 09.02.2012    source источник


Ответы (9)


Я думаю, одним из способов было бы использование полупрозрачных цветов, как описано здесь вместо непрозрачности.

например используя четырехъядерный цветовой код, например #800000FF для полупрозрачного синего.

person pareshdbest    schedule 21.06.2013
comment
Если вы можете назначить один цвет напрямую (не составной элемент и не изображение), это решение идеально. - person jdo; 09.07.2013
comment
Спасибо, это решило мою проблему. На самом деле я просто установил # 00000000, и это сработало отлично. - person While-E; 10.08.2018
comment
Чтобы подчеркнуть, цифры прозрачности — это первые две цифры. На этой диаграмме можно найти различные значения альфа-канала: gist.github.com/lopspower/03fb1cc0ac9f32ef38f4. - person pooya13; 21.04.2021

На самом деле установка 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'
    }
}

Это решение, но убедитесь, что вы знаете, что делаете, когда включаете слои.

Другим возможным решением было бы использование затенения.

Спасибо peppe на #qt@freenode.

person ChALkeR    schedule 17.12.2013

Вы не можете. Значение непрозрачности элементов относительно их родителей, поэтому, если вы кодируете что-то вроде

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

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

Вы увидите, что два прямоугольника имеют одинаковую непрозрачность.

person TheHuge_    schedule 17.07.2012
comment
Я могу подтвердить это поведение даже сейчас. Честно говоря, я не вижу причин для такого выбора, подозреваю, что это баг. - person Avio; 06.06.2013
comment
Я не думаю, что это ошибка. Это одна и та же форма многих общих свойств (например: x, y, z). Это позволяет вам не упорядочивать каждый элемент с помощью абсолютных ссылок. - person TheHuge_; 10.06.2013
comment
Я попытался открыть ошибку в QtQml, она была закрыта за считанные минуты, так что, похоже, люди из Qt придерживаются вашего мнения. Но я все еще скептически отношусь к этому вопросу. Если я пишу строку кода, я не хочу, чтобы ее игнорировали, во-первых, во-вторых, если ее нужно игнорировать, я хотел бы предупредить, что мой код не действует. Но, опять же, я не вижу причин, по которым, если блок элементов имеет непрозрачность 0,5, я не могу сделать только один из них с непрозрачностью 1. И если они логически сгруппированы как дочерние элементы основного контейнера, то почему Я делаю только одного из них родным братом? - person Avio; 10.06.2013
comment
Если вы устанавливаете непрозрачность группы элементов на 0,5, это означает для меня (и для ребят из Qt), что вы хотите установить это значение для всех элементов в группе. В противном случае вы должны установить это значение только для тех элементов, которые вы хотите. - person TheHuge_; 10.06.2013
comment
Я имею в виду возможность добавить исключение в политику непрозрачности группы. Если у вас есть десятки элементов внутри логической группы, и вы хотите, чтобы только один из них вел себя иначе, чем другие, зачем вам брать его и размещать отдельно от остальных? Я имею в виду, что логическая иерархия элементов существует независимо от непрозрачности ее членов. - person Avio; 10.06.2013
comment
Вы можете добавить пользовательское свойство defaultOpacity в корень и указать непрозрачность каждого дочернего элемента на него или установить определенное значение в исключительных. Конечно, я не говорю, что это правильный способ лечения наследования непрозрачности; это просто имеет смысл для меня. - person TheHuge_; 10.06.2013
comment
да... именно так непрозрачность обычно работает в графе сцены: непрозрачность узла - это локальная непрозрачность узла, умноженная на его предков, непрозрачность. По этой причине, если родитель имеет локальную непрозрачность 0,5, а дочерний элемент имеет локальную непрозрачность 1,0, результирующая непрозрачность для дочернего элемента будет равна родительской непрозрачности (0,5) x дочерней локальной непрозрачности (1,0) = 0,5. Однако я ожидаю, что установка значения непрозрачности на 2,0 сработает, потому что 0,5 * 2,0 = 1,0. Я попробовал, и это не сработало, к сожалению. Похоже, что Qt слишком рано зажимает значения непрозрачности между 0 .. 1... :( - person mchiasson; 21.10.2015

Я только сейчас столкнулся с этой проблемой. Использование Qt 5.1.0

В моем случае у меня был элемент Rectangle с элементом opacity: 0.6 и дочерним элементом Image. Image наследовал прозрачность - нежелательно.

Чтобы решить эту проблему, я заключил основной элемент Rectangle в элемент Item. Переданы определения размера/позиции из Rectangle во внешний Item. Переместил Image за пределы Rectangle.

В конце концов, у меня был Item в качестве основного родителя, а Rectangle и Image рядом, внутри Item.

Только Rectangle сохранил непрозрачность 0,6, поэтому прямоугольник имеет прозрачность, а Image полностью непрозрачен.

person Nuno Faria    schedule 24.06.2013

Это возможно! Вам нужно проверить в области Component.onCompleted непрозрачность родителя. Если его 0, вам нужно изменить родителя вашего объекта на родителя его текущего родителя.

Пример:

Item{
    id:root

    Item{
        id:currentParent
        opacity: 0
        Item{
            id:item
            Component.onCompleted:{
                if(parent.opacity === 0)
                    item.parent = currentParent.parent
            }
        }
    }
}
person Mido    schedule 10.07.2015

Вы не можете запретить дочернему элементу наследовать непрозрачность от своего родителя.

Моя личная работа заключается в том, чтобы изменить это:

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
    }
}
person mchiasson    schedule 23.10.2015

Я не думаю, что это возможно. вы должны сделать два элемента родственными и изменить их непрозрачность по своему желанию.

person Kunal    schedule 20.02.2012

это невозможно сделать, но вы можете изменить их цвет с помощью

Qt.lighter(color,opacity)

Например

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

  Rectangle {
    color: Qt.lighter("blue",1)
    width: 100; height: 100
  }
}
person sayyed mohsen zahraee    schedule 28.10.2017

Я также столкнулся с этой проблемой с Qt 4.8.6.

В моем конкретном случае я хотел, чтобы элемент верхнего уровня был прозрачным на 20% и имел черный цвет, но чтобы на его дочерние элементы не влияли какие-либо настройки непрозрачности/прозрачности родительского элемента.

Непрозрачность не работала из-за механизма наследования QML.

Но я смог использовать функцию rgba из объекта Qml Qt. Это позволило мне получить именно то, что я хотел, родительский элемент теперь прозрачен на 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 работала, но не для чистого черного.

person ManuelH    schedule 18.11.2014
comment
свойство цвета в QML — это ARGB, а не RGBA. Измените свой цвет на #FA000000, и он будет работать. - person mchiasson; 23.10.2015
comment
Ты прав. Возможно, из-за того, что я работал с Qt.rgba(..) ранее, я застрял в памяти, когда цветовой тип использовал тот же формат. - person ManuelH; 23.10.2015