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

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

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

Пересекающиеся пути

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


person Damir Porobic    schedule 02.09.2016    source источник
comment
Я думаю это невозможно. Каждый элемент просто рисуется поверх всего остального. Он не знает, какой элемент нарисован под ним. Кроме того, то, что вы хотите, противоречит идее полупрозрачности - если элемент под ним полностью закрыт верхним элементом, верхний элемент фактически скрывает его, что противоречит идее полупрозрачности. Просто сделайте ваши предметы непрозрачными.   -  person sashoalm    schedule 02.09.2016
comment
На самом деле, можете ли вы сделать элементы дочерними для какого-либо другого элемента? Сами элементы полностью непрозрачны, но плоскость родительского элемента, на которой они нарисованы, полупрозрачна. Я не знаю, что вы можете иметь это, хотя. Это то, чего вы действительно хотите, верно?   -  person sashoalm    schedule 02.09.2016
comment
Также см. stackoverflow.com/questions/31403383/   -  person sashoalm    schedule 02.09.2016
comment
Спасибо @sashoalm за ответы. Я попытался создать пользовательский QGraphicsItems, который рисует свой собственный путь, но эффект такой же, как и выше, даже с установкой CompositionMode, как описано в ссылке, которой вы поделились, пробовал также другой другой режим композиции, но эффект совершенно странный (изменение цвет фона и тому подобное). Я думал о том, чтобы проверить, перекрываются ли пути, если да, добавьте новый путь в качестве подпути к уже существующему, не знаю, сработает ли это. Кроме того, мне нужно иметь возможность стирать пути отдельно, не уверен, что это будет работать с подпутями.   -  person Damir Porobic    schedule 02.09.2016
comment
Что насчет моего второго комментария? Можно ли сделать их полностью непрозрачными, но дочерними для полупрозрачного элемента родительского слоя?   -  person sashoalm    schedule 02.09.2016
comment
Интересная идея, не думал об этом. Нужно проверить, как это будет работать с другими параметрами рисования, поскольку у меня также есть какой-то рисунок пером, который полностью непрозрачен, поэтому в конечном итоге мне нужно будет использовать два слоя с разными настройками прозрачности. Это в конечном итоге сделает меня неспособным добраться до вещей ниже верхнего слоя, если мне нужно будет их стереть.   -  person Damir Porobic    schedule 02.09.2016
comment
Я вернулся к использованию painter->setCompositionMode, похоже, что CompositionMode_ColorBurn может работать, хотя он немного темнее на темном фоне, но очень хорош на более ярком фоне, таком как белый. Думаю, я пропустил это, когда тестировал это решение в первую очередь. i.imgur.com/FlZSELk.png   -  person Damir Porobic    schedule 03.09.2016


Ответы (2)


Я немного поискал о том, есть ли в 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
comment
Еще раз спасибо @sashoalm за дальнейшее изучение этого вопроса. На данный момент я согласен с использованием решения режима композиции в функции рисования, оно не идеально, но достаточно хорошо. Я также тестировал некоторые другие решения, такие как добавление новых путей к одному элементу в виде подпутей, это сработало, но это такое уродливое решение, что я отошел от него. - person Damir Porobic; 05.09.2016

Возвращаясь к этому вопросу спустя долгое время, окончательным решением для меня действительно было использование CompositionMode, а именно QPainter::CompositionMode_Multiply, но ошибка, с которой я столкнулся, заключалась в том, что у меня была альфа-канал в используемых цветах. С упомянутым CompositionMode и отсутствием альфы в цвете я получаю именно тот результат, который искал.

person Damir Porobic    schedule 17.04.2021