BlinCT
BlinCT26 июля 2016 г. 11:39

Полупрозрачность одних элементов и не прозрачность других

opacity, qml, Qt

Всем привет.
Возникла такая необходимость, нужно сделать панели прозрачность opacity: 0.5
На ней находятся еще элементы а на них еще. Так как тут идет наследование то чилдрены тоже получают эту полу прозрачность. А как задать некоторым наследникам не прозрачность? Пробовал но все остается полупрозрачным. скрин прилагаю к теме.
Заранее спасибо.

Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Вам это нравится? Поделитесь в социальных сетях!

6
Evgenii Legotckoi
  • 27 июля 2016 г. 1:10

Добрый день.
Да, child объекты наследуют свойство непрозрачности родителя, и изменение непрозрачности у child объектов не позволяет обойти тот уровень непрозрачности, который выставлен у родителя.
Но можно попробовать применить следующий ход.
Сменить родителя на того, который располагается на уровень выше, по сигналу completed() о создании child элемента.
Я не заметил проблем с позиционированием, после применения данного хода, но нужно учитывать этот момент и внимательно применять данный приём.

import QtQuick 2.7
import QtQuick.Controls 2.0
 
ApplicationWindow {
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")
 
    Rectangle {
        id:currentParent
        width: 200
        height: 200
        color: "red"
        anchors.centerIn: parent
        opacity: 0.2
 
        Rectangle {
            id:item
            width: 50
            height: 50
            color: "green"
            anchors.centerIn: parent
 
            Component.onCompleted: {
                // Проверяем уровень непрозрачности родительского объекта
                // И если он находится в заданном значении,
                // то меняем родительский элемент с текущего на родительский элемент родительского элемента
                if (parent.opacity === 0.2)
                    item.parent = currentParent.parent
            }
        }
    }
}

    MR
    • 27 июля 2016 г. 5:02
    Свойство layer.enabled также может быть использовано для управления поведением наследования прозрачности. Так, установленное в true для родителя, данное свойство позволит игнорировать наследование прозрачности потомками: они будут иметь “общую” с родителем прозрачность, то есть весь элемент с потомками будет прозрачным, как отдельное изображение, а сами потомки не будут между собой просвечиваться. Однако же, это свойство появилось только в QtQuick 2.0, соответственно, отсутствует в Qt 4.
      Evgenii Legotckoi
      • 27 июля 2016 г. 9:21
      Max, а ты не мог бы привести рабочий пример кода с QtQuick.Controls 2.0?
      Поскольку на Qt 5.7 и QtQuick.Controls 2.0 и layer.enabled не даёт тот же результат, что я привел во вложении на картинке.
        MR
        • 27 июля 2016 г. 17:17

        Конечно. Вот пример, как работает обычно:

           Rectangle
            {
                width: 300
                height: width
                color: "red"
                opacity: 0.5
                Rectangle
                {
                    width: 200
                    height: width
                    x: 0
                    y: x
                    color: "blue"
                    layer.enabled: false
                }
                Rectangle
                {
                    width: 200
                    height: width
                    x: 100
                    y: x
                    color: "green"
                }
            }

        А вот, для прозрачности всей сцены при использовании layer.enabled:

           Rectangle
            {
                width: 300
                height: width
                color: "red"
                layer.enabled: true
                opacity: 0.5
                Rectangle
                {
                    width: 200
                    height: width
                    x: 0
                    y: x
                    color: "blue"
                    layer.enabled: false
                }
                Rectangle
                {
                    width: 200
                    height: width
                    x: 100
                    y: x
                    color: "green"
                }
            }

        Результаты во вложениях. Как видно, при использовании нового свойства вся сцена целиком имеет прозрачность, а не отдельные её элементы. Думаю, именно это и должно было произойти у BlinCT.

          Evgenii Legotckoi
          • 27 июля 2016 г. 23:20
          • Ответ был помечен как решение.

          Max, всё равно предложенный тобой вариант не работает так, как требуется. Проблема в том, что всё равно все элементы становятся немного прозрачными.
          Вот предлагаемый тобой вариант кода:

          import QtQuick 2.7
          import QtQuick.Controls 2.0
           
          ApplicationWindow {
              visible: true
              width: 640
              height: 480
              title: qsTr("Hello World")
           
              Rectangle {
                  x: 50
                  y: 50
                  z: 0
                  width: 200
                  height: 200
                  color: "red"
              }
           
              Rectangle
              {
                  z: 1
                  width: 300
                  height: width
                  color: "red"
                  layer.enabled: true
                  opacity: 0.5
                  Rectangle
                  {
                      width: 200
                      height: width
                      x: 0
                      y: x
                      color: "blue"
                      layer.enabled: false
                  }
                  Rectangle
                  {
                      width: 200
                      height: width
                      x: 100
                      y: x
                      color: "green"
                  }
              }
          }

          А вот вариант с необходимым результатом по прозрачности.

          import QtQuick 2.7
          import QtQuick.Controls 2.0
           
          ApplicationWindow {
              visible: true
              width: 640
              height: 480
              title: qsTr("Hello World")
           
              Rectangle {
                  x: 50
                  y: 50
                  z: 0
                  width: 200
                  height: 200
                  color: "red"
              }
           
              Rectangle
              {
                  id: currentParent
                  z: 1
                  width: 300
                  height: width
                  color: "red"
                  opacity: 0.2
           
                  Rectangle
                  {
                      id: item1
                      width: 200
                      height: width
                      x: 0
                      y: x
                      color: "blue"
                      Component.onCompleted: {
                          // Проверяем уровень непрозрачности родительского объекта
                          // И если он находится в заданном значении,
                          // то меняем родительский элемент с текущего на родительский элемент родительского элемента
                          if (parent.opacity === 0.2)
                              item1.parent = currentParent.parent
                      }
                  }
                  Rectangle
                  {
                      id: item2
                      width: 200
                      height: width
                      x: 100
                      y: x
                      color: "green"
                      Component.onCompleted: {
                          // Проверяем уровень непрозрачности родительского объекта
                          // И если он находится в заданном значении,
                          // то меняем родительский элемент с текущего на родительский элемент родительского элемента
                          if (parent.opacity === 0.2)
                              item2.parent = currentParent.parent
                      }
                  }
              }
          }

          В качестве индикатора прозрачности применяется красный прямоугольник.
          То есть требуется, чтобы все дочерние элементы имели 100% непрозрачность. А с манипуляциями через layer.enabled этого не получается.

            MR
            • 28 июля 2016 г. 2:34
            Да, это всё верно и понятно. Хочу заметить, что вариант с layer.enabled я предложил как способ создания более специфичного эффекта прозрачности, а не как вариант первого предложенного решения. Бывает так, что именно всю сцену нужно сделать полупрозрачной, а в таком случае потомки будут просвечивать друг друга, что не очень хорошо для интерфейса с множеством вложенных элементов.

              Комментарии

              Только авторизованные пользователи могут публиковать комментарии.
              Пожалуйста, авторизуйтесь или зарегистрируйтесь
              d
              • dsfs
              • 26 апреля 2024 г. 4:56

              C++ - Тест 004. Указатели, Массивы и Циклы

              • Результат:80баллов,
              • Очки рейтинга4
              d
              • dsfs
              • 26 апреля 2024 г. 4:45

              C++ - Тест 002. Константы

              • Результат:50баллов,
              • Очки рейтинга-4
              d
              • dsfs
              • 26 апреля 2024 г. 4:35

              C++ - Тест 001. Первая программа и типы данных

              • Результат:73баллов,
              • Очки рейтинга1
              Последние комментарии
              k
              kmssr8 февраля 2024 г. 18:43
              Qt Linux - Урок 001. Автозапуск Qt приложения под Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
              АК
              Анатолий Кононенко5 февраля 2024 г. 1:50
              Qt WinAPI - Урок 007. Работаем с ICMP Ping в Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
              EVA
              EVA25 декабря 2023 г. 10:30
              Boost - статическая линковка в CMake проекте под Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
              J
              JonnyJo25 декабря 2023 г. 8:38
              Boost - статическая линковка в CMake проекте под Windows Сделал всё по-как у вас, но выдаёт ошибку [build] LINK : fatal error LNK1104: не удается открыть файл "libboost_locale-vc142-mt-gd-x64-1_74.lib" Хоть убей, не могу понять в чём дел…
              G
              Gvozdik18 декабря 2023 г. 21:01
              Qt/C++ - Урок 056. Подключение библиотеки Boost в Qt для компиляторов MinGW и MSVC Для решения твой проблемы добавь в файл .pro строчку "LIBS += -lws2_32" она решит проблему , лично мне помогло.
              Сейчас обсуждают на форуме
              PS
              Peter Son3 мая 2024 г. 17:57
              Best Indian Food Restaurant In Cincinnati OH Ready to embark on a gastronomic journey like no other? Join us at App india restaurant and discover why we're renowned as the Best Indian Food Restaurant In Cincinnati OH . Whether y…
              Evgenii Legotckoi
              Evgenii Legotckoi2 мая 2024 г. 14:07
              Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Добрый день. По моему мнению - да, но то, что будет касаться вызовов к функционалу Андроида, может создать огромные трудности.
              IscanderChe
              IscanderChe30 апреля 2024 г. 4:22
              Во Flask рендер шаблона не передаётся в браузер Доброе утро! Имеется вот такой шаблон: <!doctype html><html> <head> <title>{{ title }}</title> <link rel="stylesheet" href="{{ url_…
              G
              Gar22 апреля 2024 г. 5:46
              Clipboard Как скопировать окно целиком в clipb?
              Павел Дорофеев
              Павел Дорофеев14 апреля 2024 г. 2:35
              QTableWidget с 2 заголовками Вот тут есть кастомный QTableView с многорядностью проект поддерживается, обращайтесь

              Следите за нами в социальных сетях