Я искал немного о том, имеет ли Qt истинное наслоение для непрозрачности, и нашел пост в Qt Блог Андреаса Aardal Хансена:
https://blog.qt.io/blog/2009/04/23/layered-rendering-part-2-it-helps-solve-many-problems/
Он говорит, что единственный способ сделать это использует off- рендеринг экрана.
При визуализации «зеленого поддерева» на отдельный слой мы можем комбинировать все элементы и применять единую непрозрачность как часть составления этих элементов вместе. В своем последнем блоге я писал о внеэкранном рендеринге. Эта работа продвигалась и находится в довольно полезном состоянии (хотя код действительно уродлив). Оно работает! Результат рендеринга для того же приложения, что и выше, выглядит следующим образом.
Ссылка на решение для отображения вне экрана: https://blog.qt.io/blog/2009/02/27/braindump-graphics-view-and-the-joys-of-off-screen-rendering.
Я думаю, идея состоит в том, что вы каждый отдельный слой выделяете в pixmap. Элементы в этом слое непрозрачны относительно друг друга. Затем вы визуализируете слои с прозрачностью относительно друг друга.
Элементы одного и того же слоя непрозрачны относительно друг друга, но прозрачны относительно предметов в других слоях.
Ссылка рассказывает о проекте прототипа, который использует DeepItemCoordinateCache, который отображает элемент и его дочерние элементы в буфер вне экрана, а затем отображает этот буфер. Это обеспечило бы желаемый эффект.
Возможно сведение поддерева в один буфер вне экрана. Я провел два дня на этой неделе, изучая его, написал код и закончил с прототипом, который настолько уродлив, что я не хочу делиться им еще только. Но я видел, что это вполне возможно, не испортив внутренности QGV. Я назвал два новых режима кэша:
DeepItemCoordinateCache - кэширует пункт и «все» дети, ни перерисовки для «любого» ребенка, если родитель превращается DeepDeviceCoordinateCache - сохранить для DeviceCoordinateCache
К сожалению, я не Не знаю, доступен ли его код прототипа. Он подразумевает, что он находится внутри примера Embedded Dialogs в https://doc.qt.io/qt-5/qtwidgets-graphicsview-embeddeddialogs-example.html, так что, возможно, вам следует искать там.
Я думаю, что это невозможно. Каждый элемент просто рисует поверх всего остального. Он не осведомлен о том, какой предмет рисуется под ним.Кроме того, то, что вы хотите, противоречит идее полупрозрачности - если элемент под ним полностью покрыт верхним элементом, то верхний элемент эффективно скрывает его, что противоречит идее полупрозрачности. Просто сделайте свои вещи непрозрачными. – sashoalm
На самом деле, можете ли вы сделать предметы детьми из другого предмета? Сами элементы полностью непрозрачны, но плоскость родительского элемента, на которой они нарисованы, полупрозрачна. Я не знаю, что вы можете это сделать. Это то, что вы действительно хотите, не так ли? – sashoalm
Также см. Https://stackoverflow.com/questions/31403383/qt-overlapping-semitransparent-qgraphicsitem – sashoalm