PyQt中的图形绘制

'''
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)在每次重绘时都要重新创建图形。

 

原文地址:https://www.cnblogs.com/fuxianfeng1988/p/3247461.html