Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用PYQT5绘制形状_Python_Pyqt_Pyqt5_Shapes_Qpainter - Fatal编程技术网

Python 使用PYQT5绘制形状

Python 使用PYQT5绘制形状,python,pyqt,pyqt5,shapes,qpainter,Python,Pyqt,Pyqt5,Shapes,Qpainter,首先,定义存储形状的长度、位置和(随机生成的)颜色的基类形状。从那里,您可以继承这些基本属性并进一步指定其他形状。您的程序至少必须支持正方形、矩形、三角形、圆和椭圆。每个形状都应该在基于形状的继承层次结构中定义自己的类。请记住,继承通常跨越多个级别,因此考虑并实现适当的继承方案。定义各种形状的类应该通过添加额外的所需属性、在初始化期间适当地调用父构造函数以及包括使用作为参数提供的QPaint实例绘制形状的方法来进一步指定形状类。请注意,图形类完全封装了图形概念,包括图形绘制代码。通过向形状的绘制

首先,定义存储形状的长度、位置和(随机生成的)颜色的基类形状。从那里,您可以继承这些基本属性并进一步指定其他形状。您的程序至少必须支持正方形、矩形、三角形、圆和椭圆。每个形状都应该在基于形状的继承层次结构中定义自己的类。请记住,继承通常跨越多个级别,因此考虑并实现适当的继承方案。定义各种形状的类应该通过添加额外的所需属性、在初始化期间适当地调用父构造函数以及包括使用作为参数提供的QPaint实例绘制形状的方法来进一步指定形状类。请注意,图形类完全封装了图形概念,包括图形绘制代码。通过向形状的绘制方法提供一个已经在使用的Qpaint实例,问题表明形状应该使用作为参数提供的
Qpaint
对象绘制自己。在您的实现中,您正在
paintEvent
中创建单独的
QPainter
实例。不必重载
paintEvent
,您可以在每个
Shape
子类中实现一个paint方法,该方法接受
qpaint
对象作为参数来绘制形状。在主窗口的
paintEvent
方法中,您可以创建
QPainter
对象,迭代添加到窗口中的所有形状,并为每个形状调用
shape.paint(painter)

class Shape():
    def __init__(self, length, position, color, parent=None):
        self.color = color
        self.position = position
        self.length = length

    def paint(self, painter):
        pass

class Circle(Shape):
    def paint(self, painter):
        if not painter.isActive():
            return
        painter.save()
        painter.setPen(QPen(self.color,  4 , Qt.SolidLine))
        x, y = self.position.x(), self.position.y()
        painter.drawEllipse(x, y, self.length, self.length)
        painter.restore()

等,并在
窗口中

class Window(QWidget):
    def __init__(self):
        super().__init__()
        self.resize(500, 500)
        self.shapes = []

    def paintEvent(self, event):
        super().paintEvent(event)
        painter = QPainter(self)
        painter.setRenderHint(QPainter.Antialiasing)
        for shape in self.shapes:
            shape.paint(painter)
要测试实现,请执行以下操作:

if __name__ == "__main__":
    App = QApplication(sys.argv)
    window = Window()
    for _ in range(20):
        pos = QtCore.QPoint(*random.choices(range(500), k=2))
        length = random.randrange(100)
        color = QtGui.QColor(*random.choices(range(256), k=3))
        window.shapes.append(Circle(length, pos, color))
    window.show()
    sys.exit(App.exec())
pos=QtCore.QPoint(*随机选择(范围(500),k=2))
if __name__ == "__main__":
    App = QApplication(sys.argv)
    window = Window()
    for _ in range(20):
        pos = QtCore.QPoint(*random.choices(range(500), k=2))
        length = random.randrange(100)
        color = QtGui.QColor(*random.choices(range(256), k=3))
        window.shapes.append(Circle(length, pos, color))
    window.show()
    sys.exit(App.exec())