Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ QGraphicsPathItem重叠半透明路径变得更加不透明_C++_Qt_Qgraphicsscene_Qgraphicsitem - Fatal编程技术网

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

C++ QGraphicsPathItem重叠半透明路径变得更加不透明,c++,qt,qgraphicsscene,qgraphicsitem,C++,Qt,Qgraphicsscene,Qgraphicsitem,我正在用QGraphicsPathItems绘制半透明路径,但我有一个问题,当两条路径重叠时,它们会变得更加不透明,但我希望它们保持相同的透明度,不管有多少条路径重叠 在左侧,两条单独的路径变得更加不透明。在右边,单路径交叉,透明度相同,这是我希望通过多条路径实现的效果 有可能达到这样的效果吗?我搜索了一些关于Qt是否具有真实的不透明度分层的信息,并在Qt博客中找到了Andreas Aardal Hanssen的一篇文章: 他说唯一的方法是使用屏幕外渲染 通过将“绿色子树”渲染到一个单独的层

我正在用QGraphicsPathItems绘制半透明路径,但我有一个问题,当两条路径重叠时,它们会变得更加不透明,但我希望它们保持相同的透明度,不管有多少条路径重叠

在左侧,两条单独的路径变得更加不透明。在右边,单路径交叉,透明度相同,这是我希望通过多条路径实现的效果


有可能达到这样的效果吗?

我搜索了一些关于Qt是否具有真实的不透明度分层的信息,并在Qt博客中找到了Andreas Aardal Hanssen的一篇文章:

他说唯一的方法是使用屏幕外渲染

通过将“绿色子树”渲染到一个单独的层中,我们可以合并所有项目并应用一个统一的不透明度,作为将这些项目组合在一起的一部分。在我的上一篇博客中,我写了关于屏幕外渲染的文章。这项工作已经取得进展,并且处于相当可用的状态(尽管代码非常难看)。它起作用了!与上面相同的应用程序的渲染输出如下所示

指向屏幕外渲染解决方案的链接为

我认为这样做的目的是将每个层分别渲染到一个像素贴图。该层中的项目相对彼此不透明。然后渲染层本身,使其具有相对的透明度

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

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


将子树折叠到单个屏幕外缓冲区是可能的。本周我花了两天时间研究它,写了一些代码,最后得到了一个非常难看的原型,我现在还不想分享它 过了很长一段时间,回到这个问题上来,我的最终解决方案是使用合成模式,确切地说是
QPainter::CompositionMode_Multiply
,但我韦利尔所犯的错误是,我使用的颜色中有alpha。使用上面提到的合成模式,并且颜色中没有alpha,我得到的结果正是我想要的。

我认为这是不可能的。每一件物品都只是将自己置于其他物品之上。它不知道下面画的是什么项目。此外,你想要的东西与半透明度的概念相矛盾——如果下面的项目完全被顶部项目覆盖,那么顶部项目会有效地隐藏它,这与半透明度的概念相反。让你的项目不透明。实际上,你能让项目成为其他项目的子项目吗?项目本身是完全不透明的,但在其上绘制项目的父项目平面是半透明的。不过我不知道你能不能得到。这才是你真正想要的,对吧?另请参见感谢@sashoalm的回复。我曾尝试创建自定义QGraphicsItems,绘制自己的路径,但效果与上面相同,即使设置了您共享的链接上解释的合成模式,也尝试了其他不同的合成模式,但效果完全奇怪(更改背景颜色和类似颜色)。我正在考虑检查路径是否重叠,如果是,将新路径作为子路径添加到现有路径,不知道这是否可行。另外,我需要能够分别擦除路径,不确定它是否能与子路径一起工作。我的第二条评论呢?有没有可能使它们完全不透明,但子对象是半透明的父层项目?再次感谢@sashoalm进一步研究。目前,我对在paint函数中使用合成模式解决方案很满意,它虽然不完美,但已经足够好了。我也测试了一些其他的解决方案,比如以子路径的形式将新路径全部添加到单个项目中,它是有效的,但这是一个丑陋的解决方案,我已经放弃了它。