2016-09-02 6 views
3

Я рисую полупрозрачные пути с помощью QGraphicsPathItems, но у меня есть проблема, когда два пути перекрываются, они становятся более непрозрачными, но я бы хотел, чтобы они сохраняли одинаковый уровень прозрачности, независимо от того, сколько пути перекрываются.QGraphicsPathItem перекрытие полупрозрачного пути становится более непрозрачным

С левой стороны две отдельные дорожки, становятся более непрозрачными. Справа, один путь, пересекающий себя, тот же уровень прозрачности, это тот эффект, который я хотел бы достичь несколькими путями.

Overlapping paths

Можно ли добиться чего-то подобного?

+0

Я думаю, что это невозможно. Каждый элемент просто рисует поверх всего остального. Он не осведомлен о том, какой предмет рисуется под ним.Кроме того, то, что вы хотите, противоречит идее полупрозрачности - если элемент под ним полностью покрыт верхним элементом, то верхний элемент эффективно скрывает его, что противоречит идее полупрозрачности. Просто сделайте свои вещи непрозрачными. – sashoalm

+0

На самом деле, можете ли вы сделать предметы детьми из другого предмета? Сами элементы полностью непрозрачны, но плоскость родительского элемента, на которой они нарисованы, полупрозрачна. Я не знаю, что вы можете это сделать. Это то, что вы действительно хотите, не так ли? – sashoalm

+2

Также см. Https://stackoverflow.com/questions/31403383/qt-overlapping-semitransparent-qgraphicsitem – sashoalm

ответ

0

Я искал немного о том, имеет ли 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, так что, возможно, вам следует искать там.

+0

Еще раз спасибо @sashoalm за то, что вы изучили это дальше. Я в порядке с использованием решения режима композиции в функции краски сейчас, это не идеально, но достаточно хорошо. Я также тестировал некоторые другие решения, такие как добавление новых путей в один элемент в виде подпутей, но это было уродливое решение, которое я отступил от него. –