'''
class Node: 画目标节点
功能描述:绘制一个圆表示目标节点
'''
class Node(QGraphicsItem):
Rect = QRectF(-10, -10, 20, 20)
def __init__(self, color, position):
super(Node, self).__init__()
self.color = color
self.setPos(position)
def boundingRect(self):
return Node.Rect
def shape(self):
path = QPainterPath()
path.addEllipse(Node.Rect) #向路径中添加一个圆
return path
def paint(self, painter, option, widget=None):
global k
while True:
x = self.xx
y = self.yy
if (-SCENESIZE )<= x <= SCENESIZE and (-SCENESIZE ) <= y <= SCENESIZE:
break
self.setPos(QPointF(x, y))
painter.setPen(Qt.NoPen) #Qt.NoPen表示不进行线条或边框的绘制
#painter.setBrush(QBrush(self.color))
painter.setBrush(QBrush(Qt.black,1))
painter.drawPath(self.shape()) #绘制路径
#painter.drawEllipse(Node.Rect)
QToolTip.setFont(QFont('Courier New', 12))
strToolTip=QString("x=%d,y=%d" % (x,y))
self.setToolTip(strToolTip)
painter.setPen(Qt.yellow)
textFont = QFont("宋体", 18, QFont.Bold)
painter.setFont(textFont)
painter.drawText(Node.Rect, Qt.AlignCenter, "%d" % self.id)
self.scene().update()
if k==NodeNumber:
switchEvent.set()
k=1
else:
k=k+1
1.绘制文字
painter.drawText(Node.Rect, Qt.AlignCenter, "%d" % self.id)
第一个参数指定绘制文字所在的矩形;第二个参数指定了文字在矩形中的对齐方式,
第三个参数就是所要绘制的文字。
2.绘制路径
如果要重复绘制一个复杂的图形,可以使用QPainterPath类对象,然后使用QPainter.drawPath()来进行绘制。QPainterPath类为绘制操作提供了一个容器,可以用来创建图形并且进行重复使用。在Node类的shape()函数中,我们向路径中添加一个圆(path.addEllipse(Node.Rect))。当我们要绘制节点时(即在paint()函数中):
(1)我们只需调用drawPath()来进行绘制即可(粉红色部分);
(2)当然我们也可以用painter.drawEllipse(Node.Rect)来达到同样的效果。但当我们需要重复绘制复杂的图形时,我们会发现方法(1)明显变得简单许多,因为创建图形时我们只需把要绘制的图形添加进绘制路径,每次需要重绘时只需调用drawPath()对绘制路径的内容进行绘制即可。而方法(2)在每次重绘时都要重新创建图形。