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

python Pyqt setCompositionMode

如何解决python Pyqt setCompositionMode

我已经能够绘制图像的透明通道,现在我遇到了问题。如何通过画笔重新显示透明区域? 虽然我使用了 setcompositionmode 等常量,但它们无法通过画笔重新显示。谁能帮我解决问题?非常感谢。

class parentItem(QGraphicsItem):

    __image = None
    __pos = QPoint(0,0)

    def __init__(self,image: QImage):
        super(parentItem,self).__init__()
        self.setFlag(QGraphicsItem.ItemIsSelectable,True)

        image.convertTo(QImage.Format_ARGB32_Premultiplied)
        self.__image = image

        self.painter = QPainter()

    def paint(self,painter: QPainter,option,widget):

        painter.drawImage(0,self.__image)

        self.painter.begin(self.__image)

        self.painter.setCompositionMode(QPainter.CompositionMode_DestinationOut)

        radialGrad = QRadialGradient(self.__pos,80)
        radialGrad.setColorAt(0,QColor(255,255,255))
        radialGrad.setColorAt(1,0))
        brush = QBrush(radialGrad)
        self.painter.setBrush(brush)
        self.painter.setPen(Qt.nopen)
        self.painter.drawEllipse(self.__pos,80,80)

        self.painter.end()

    def mousepressEvent(self,event: 'QGraphicsSceneMouseEvent') -> None:
        super(parentItem,self).mousepressEvent(event)
        self.__pos = event.scenePos()

    def mouseMoveEvent(self,self).mouseMoveEvent(event)
        self.__pos = event.scenePos()
        self.update()

    def mouseReleaseEvent(self,self).mouseReleaseEvent(event)

    def boundingRect(self) -> QtCore.QRectF:
        if self.__image is not None:
            return QRectF(self.__image.rect())
        else:
            return QRectF(0,0)
if __name__ == '__main__':
    app = QApplication(sys.argv)

    w = QWidget()
    w.resize(800,600)
    w.setwindowTitle('draw')
    w.show()
    layout = QVBoxLayout()
    view = QGraphicsView()
    view.setobjectName('view')
    view.setStyleSheet("background-color:gray;")
    scene = QGraphicsScene()
    view.setScene(scene)

    path = "G:/ddd.png"
    pItem = parentItem(QImage(path))

    scene.addItem(pItem)

    layout.addWidget(view)
    w.setLayout(layout)
    sys.exit(app.exec_())

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