如何在具有子路径的 QGraphicsPolygonItem 中设置形状?

问题描述 投票:0回答:1

我尝试绘制一个多边形和带有一些连接点的多边形。但是当我创建它的形状时,路径有一个

CircleItem
阴影。那不是我想要的。

代码

from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import pyqtSignal as Signal
from PyQt5.QtCore import pyqtProperty as Property
from PyQt5.QtNetwork import *

class CircleItem(QGraphicsPathItem):
    def __init__(self, parent=None):
        super().__init__(parent=parent)
        # self.setFlags(QGraphicsItem.ItemIsMovable|QGraphicsItem.ItemIsSelectable)
        self.setBrush(Qt.red)

        path = QPainterPath()
        path.addEllipse(-20, -20, 40, 40)
        self.setPath(path)

class PolyItem(QGraphicsPolygonItem):
    def __init__(self):
        super().__init__()

        poly = QPolygonF([
            QPointF(200, -0),
            QPointF(120, 150)
        ])

        self.circles = []
        for pt in poly:
            c = CircleItem(self)
            c.setPos(pt)
            self.circles.append(c)

        self.setPolygon(poly)

    def shape(self) -> QPainterPath:
        path = QPainterPath()
        path.addPolygon(self.polygon())

        for c in self.circles:
            path.addPath(c.path())

        return path

    def boundingRect(self) -> QRectF:
        return self.shape().boundingRect()

    def paint(self, painter: QPainter, option: 'QStyleOptionGraphicsItem', widget) -> None:
        painter.drawRect(self.boundingRect())

        painter.setPen(Qt.blue)
        painter.drawPath(self.shape())
        return super().paint(painter, option, widget)

class View(QGraphicsView):
    def __init__(self):
        super().__init__()
        pl = PolyItem()
        self.setScene(QGraphicsScene())
        self.scene().addItem(pl)

if __name__ == '__main__':
    app = QApplication([])
    win = View()
    win.show()
    app.exec()


结果

pyqt5 qgraphicsview
1个回答
0
投票

你的PolyItem是一个QGraphicsPolygonItem,所以它全部继承自QGraphicsPolygonItem 那么你可以像对待 QGraphicsPolygonItem 一样对待它:

        poly = QPolygonF([
            QPointF(200, -0),
            QPointF(120, 150),
            QPointF(100, 100),
            QPointF( 20,  50)
        ])

        pl = PolyItem( poly )

要在没有蓝球的情况下快速测试它,您可以构建一个什么都不做的 PolyItem:

class PolyItem(QGraphicsPolygonItem):
    def __init__(self, polyParam ):
        super().__init__( polyParam )

既然有了基础,想要完善PolyItem:

class PolyItem(QGraphicsPolygonItem):
    def __init__(self, polyParam ):
        super().__init__( polyParam )
        for pt in polyParam:
            c = BlueBall( pt )

但是,在 PolyItem().__init__() 中,我想在场景中添加我的 BlueBall() 。 所以,我别无选择,我必须添加场景作为参数:

class PolyItem(QGraphicsPolygonItem):
    def __init__(self, scene, polyParam ):
        super().__init__( polyParam )

        for pt in polyParam:
            c = BlueBall( pt )
            scene.addItem( c )

那么,就是这样。

完整代码下方

from PyQt5.QtCore           import *
from PyQt5.QtWidgets        import *
from PyQt5.QtGui            import *

class BlueBall(QGraphicsEllipseItem):
    def __init__(self, initialPosMove):
        radius= 20
        super().__init__(0,0,radius*2,radius*2)
        self.setPen(Qt.blue)
        self.setPos( initialPosMove - QPointF(radius,radius) )

class PolyItem(QGraphicsPolygonItem):
    def __init__(self, scene, polyParam ):
        super().__init__( polyParam )

        for pt in polyParam:
            c = BlueBall( pt )
            scene.addItem( c )


class View(QGraphicsView):
    def __init__(self):
        super().__init__()

        self.scene= QGraphicsScene()
        self.setScene( self.scene )

        poly = QPolygonF([
            QPointF(200, -0),
            QPointF(120, 150),
            QPointF(100, 100),
            QPointF( 20,  50)
        ])

        pl = PolyItem( self.scene, poly )
       #pl = QGraphicsPolygonItem( poly )
        self.scene.addItem(pl)

if __name__ == '__main__':
    app = QApplication([])
    win = View()
    win.show()
    app.exec()

© www.soinside.com 2019 - 2024. All rights reserved.