微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 QPainter 中重叠半透明 QRectangles

如何解决在 QPainter 中重叠半透明 QRectangles

当两个矩形重叠时,我注意到两者之间的交集变得更加不透明,据我所知,这是由于添加了 QBrush alpha。

重叠交叉点变得更加不透明的视觉示例:

Visual example of the overlapping intersection becoming more opaque

我想防止重叠的交叉点变得更加不透明,该区域应该与其余矩形具有相同的颜色。 (使用完全不透明的 QColor 时会发生这种情况,但我想使用半透明的)。

我已经阅读了有关该主题的几个主题包括这个非常相似的问题:Qt: Overlapping semitransparent QgraphicsItem),每个答案都说明可以通过更改画家的构图模式来解决该问题,但是我不能找到提供预期结果的合成模式,我已经尝试了 Qpainter 文档 (https://doc.qt.io/qt-5/qpainter.html#setCompositionMode) 中列出的所有 34 种合成模式。一些模式只是让 QColor 完全不透明,而大多数模式都与这个问题无关,它们都不允许我让两个矩形的交集保持与其余矩形相同的半透明颜色。

如果有人有想法,我将不胜感激。

您可以在下面找到重现问题的短代码

from PyQt5.QtWidgets import QWidget,QApplication
from PyQt5.QtGui import QPainter,QColor
from PyQt5.QtCore import QRect
import sys


class Drawing(QWidget):
    def __init__(self):
        super().__init__()
        self.setGeometry(300,300,350,300)
        self.show()

    def paintEvent(self,event):
            painter = QPainter(self)
            painter.setCompositionMode(QPainter.CompositionMode_SourceOver)
            painter.setPen(QColor(128,128,255,128))
            painter.setBrush(QColor(128,128))
            rect1 = QRect(10,10,100,100)
            rect2 = QRect(50,50,100)
            painter.drawRect(rect1)
            painter.drawRect(rect2)
                 
def main():
    app = QApplication(sys.argv)
    ex = Drawing()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main() 

解决方法

简单的解决方案是使用 QPainterPath,确保它同时使用 setFillRule(Qt.WindingFill)simplified() 版本的路径,合并所有子路径:

path = QPainterPath()
path.setFillRule(Qt.WindingFill)
path.addRect(10,10,100,100)
path.addRect(50,50,100)
painter.drawPath(path.simplified())

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。