Я немного поискал о том, есть ли в Qt настоящие слои для непрозрачности, и нашел сообщение в блоге Qt от Андреаса Аардала Ханссена:
https://blog.qt.io/blog/2009/04/23/layered-rendering-part-2-it-helps-solve-many-problems/
Он говорит, что единственный способ сделать это — использовать закадровый рендеринг.
Визуализируя «зеленое поддерево» в отдельный слой, мы можем объединить все элементы и применить единую непрозрачность как часть объединения этих элементов вместе. В моем последнем блоге я писал о рендеринге за кадром. Эта работа продвинулась и находится в вполне пригодном для использования состоянии (хотя код действительно уродлив). Оно работает! Результат рендеринга для того же приложения, что и выше, выглядит следующим образом.
Ссылка на решение для рендеринга вне экрана: https://blog.qt.io/blog/2009/02/27/braindump-graphics-view-and-the-joys-of-screen.-rendering.
Я думаю, что идея в том, что вы визуализируете каждый слой отдельно в растровое изображение. Элементы в этом слое непрозрачны по отношению друг к другу. Затем вы визуализируете сами слои с прозрачностью относительно друг друга.
Элементы одного слоя непрозрачны по отношению друг к другу, но прозрачны по отношению к элементам других слоев.
Ссылка говорит о каком-то проекте-прототипе, который использует DeepItemCoordinateCache, который отображает элемент и его дочерние элементы в закадровый буфер, а затем отображает этот буфер. Это позволит достичь желаемого эффекта.
Возможно свертывание поддерева в один закадровый буфер. На этой неделе я провел два дня, изучая его, написал немного кода и в итоге получил настолько уродливый прототип, что пока не хочу им делиться. ???? Но я видел, что это вполне возможно, не портя внутренности QGV. Я назвал два новых режима кеша:
DeepItemCoordinateCache — кэширует элемент и «все» дочерние элементы, без перерисовки для «любого» дочернего элемента, если родитель преобразован DeepDeviceCoordinateCache — сохранить для DeviceCoordinateCache
К сожалению, я не знаю, доступен ли где-нибудь код его прототипа. Он подразумевает, что это находится внутри примера встроенных диалогов по адресу https://doc.qt.io/qt-5/qtwidgets-graphicsview-embeddeddialogs-example.html, поэтому, возможно, вам следует поискать там.
person
sashoalm
schedule
04.09.2016
painter->setCompositionMode
, похоже, чтоCompositionMode_ColorBurn
может работать, хотя он немного темнее на темном фоне, но очень хорош на более ярком фоне, таком как белый. Думаю, я пропустил это, когда тестировал это решение в первую очередь. i.imgur.com/FlZSELk.png - person Damir Porobic   schedule 03.09.2016