【问题标题】:QGraphicsPathItem overlapping semitransparent path become more opaqueQGraphicsPathItem 重叠半透明路径变得更加不透明
【发布时间】:2016-09-02 05:24:48
【问题描述】:

我正在使用 QGraphicsPathItems 绘制半透明路径,但是当两条路径重叠时出现问题,它们变得更加不透明,但我希望它们保持相同级别的透明度,无论有多少路径重叠。

在左侧两条独立的路径,变得更加不透明。在右边,单条路径穿过自身,相同级别的透明度,这是我想通过多条路径实现的效果。

有没有可能实现这样的目标?

【问题讨论】:

  • 我认为这是不可能的。每个项目只是将自己绘制在其他所有项目之上。它不知道在它下面绘制了什么项目。此外,你想要的与半透明的想法相矛盾——如果下面的项目完全被顶部的项目覆盖,那么顶部的项目就会有效地隐藏它,这与半透明的想法背道而驰。只需让您的项目不透明即可。
  • 实际上,您可以将这些项目设为其他项目的子项目吗?项目本身是完全不透明的,但绘制它们的父项目平面是半透明的。不过,我不知道你能不能拥有它。这才是你真正想要的,对吧?
  • 感谢@sashoalm 的回复。我已经尝试创建自定义 QGraphicsItems 来绘制它自己的路径,但效果与上面相同,即使设置了您共享的链接上解释的 CompositionMode,也尝试了不同的其他组合模式,但效果完全奇怪(改变背景的颜色和类似的颜色)。我正在考虑检查路径是否重叠,如果是,将新路径作为子路径添加到已经存在的路径中,不知道这是否可行。另外,我需要能够单独擦除路径,不确定它是否适用于子路径。
  • 我的第二条评论呢?是否有可能使它们完全不透明但成为半透明父层项目的子级?

标签: c++ qt qgraphicsscene qgraphicsitem


【解决方案1】:

我搜索了一下关于 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 的嵌入式对话框示例中,所以也许你应该在那里搜索。

【讨论】:

  • 再次感谢@sashoalm 进一步调查。我现在可以在绘图功能中使用合成模式解决方案,它并不完美但足够好。我也测试了其他一些解决方案,例如以子路径的形式将新路径全部添加到单个项目,它有效,但它是如此丑陋的解决方案,我已经放弃了它。
【解决方案2】:

很久以后回到这个问题,对我来说最终的解决方案确实是使用 CompositionMode,确切地说是QPainter::CompositionMode_Multiply,但我更容易犯的错误是我在使用的颜色中有 alpha。使用提到的 CompositionMode 并且颜色中没有 alpha,我得到了我正在寻找的结果。

【讨论】:

    猜你喜欢
    • 2014-08-07
    • 2011-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-30
    • 2021-04-23
    相关资源
    最近更新 更多