我尝试绘制一个多边形和带有一些连接点的多边形。但是当我创建它的形状时,路径有一个
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()
你的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()