我用QGraphicsPathItems绘制半透明路径,但当两条路径重叠时,它们变得更加不透明,但我希望它们保持相同的透明度,不管有多少条路径重叠。
在左边两条独立的路径上,变得更加不透明。在右边,一条路越过自己,同样的透明度,这就是我想用几条路达到的效果。

有可能实现这样的目标吗?
发布于 2021-04-17 07:29:26
回到这个问题后,对我来说,最后的解决方案是使用确实的CompositionMode,精确的QPainter::CompositionMode_Multiply,但我的错误是,我有阿尔法在使用的颜色。使用上面提到的CompositionMode和没有alpha的颜色,我得到了我想要的结果。
发布于 2016-09-04 10:23:48
我搜索了一下Qt是否具有真正的不透明度分层,并在Andreas Aardal Hanssen的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的嵌入式对话框示例中,所以也许您应该在那里搜索。
https://stackoverflow.com/questions/39284835
复制相似问题