QGraphicsPathItem重叠半透明路径变得更不透明

时间:2016-09-02 05:24:48

标签: c++ qt qgraphicsscene qgraphicsitem

我用QGraphicsPathItems绘制半透明路径,但是当两条路径重叠时我会遇到问题,它们会变得更不透明,但我希望它们保持相同的透明度,无论路径重叠多少。

左侧有两条不同的路径,变得更加不透明。在右边,单个路径越过自身,相同的透明度,这是我想用几条路径实现的效果。

Overlapping paths

是否有可能实现这样的目标?

2 个答案:

答案 0 :(得分:0)

我搜索了一下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-off-screen-rendering

我认为我的想法是将每个图层分别渲染为像素图。该图层中的项目相对于彼此是不透明的。然后使用相对于彼此的透明度渲染图层。

同一图层中的项目相对于彼此不透明,但相对于其他图层中的项目是透明的。

该链接讨论了一些使用DeepItemCoordinateCache的原型项目,该项目将项目及其子项呈现到屏幕外缓冲区,然后呈现该缓冲区。这将达到预期的效果。

  

可以将子树折叠到单个屏幕外缓冲区中。本周我花了两天时间研究它,写了一些代码,最后得到了一个非常丑陋的原型,我不想分享它还没有。但我已经看到,如果不搞乱QGV的内部结构,这是完全可能的。我称之为两种新的缓存模式:

     

DeepItemCoordinateCache - 缓存项目和“所有”子项,如果父项被转换,则不对“任何”子项进行重新绘制   DeepDeviceCoordinateCache - 为DeviceCoordinateCache保存

不幸的是,我不知道他的原型代码是否可以在任何地方使用。他暗示它位于https://doc.qt.io/qt-5/qtwidgets-graphicsview-embeddeddialogs-example.html的嵌入式对话框示例中,所以也许你应该在那里搜索。

答案 1 :(得分:0)

很长一段时间后回到这个问题,我的最终解决方案确实使用 CompositionMode,准确地说是 QPainter::CompositionMode_Multiply 但我更糟糕的错误是我在使用的颜色中有 alpha。使用提到的 CompositionMode 并且颜色中没有 alpha,我得到了我正在寻找的结果。