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