【发布时间】:2019-11-01 23:00:50
【问题描述】:
首先,定义一个基类 Shape 来存储形状的长度、位置和(随机生成的)颜色。从那里,您可以继承这些基本属性并进一步指定其他形状。至少,您的程序必须支持正方形、矩形、三角形、圆形和椭圆形。每个形状都应该在基于形状的继承层次结构中定义自己的类。回想一下,继承通常跨越多个级别,因此请考虑并实施适当的继承方案。定义各种形状的类应进一步指定 Shape 类,方法是添加额外的所需属性,在初始化期间适当地调用父构造函数,并包括使用作为参数提供的 QPainter 实例绘制形状的方法。请注意,形状类完全封装了形状概念,包括图形绘制代码。通过为形状的绘制方法提供一个已经在使用的 QPainter 实例,
当用户单击窗口中的某个位置时(通过调用 mousePressEvent 来指示),随机创建一个新的 Shape 对象以位于单击坐标处,并将该 Shape 添加到要绘制的项目列表中,这应该是你班级的一个属性。 Shape 对象的构造函数(与其父构造函数一起)应该设置它的所有属性,包括坐标、颜色和大小。随意对形状大小应用合理的限制。每次绘制窗口时(因为触发了对paintEvent 的调用),到目前为止创建的每个形状都应该被绘制。因为它们在一个列表中(见下文),您可以使用循环遍历它们并绘制每个形状。多态性的美妙之处在于您可以将它们全部视为基本形状并要求它们自己绘制,因为它们每个都实现了一个绘制方法,该方法将 QPainter 实例(可能来自 ShapeDrawer.py 中的paintEvent)作为参数。请注意,在将它传递给形状的绘制方法之前,您必须已经通过调用它的 begin 方法来激活painter 对象。
总的来说,我已经用提供的代码完成了第一,想验证它是否正确,不知道如何做第二,需要帮助。
我提供的代码是我尝试过的。
import sys, random
from PyQt5 import QtGui, QtCore
from PyQt5.QtWidgets import QApplication, QMainWindow
from PyQt5.QtGui import QPainter, QPainterPath, QBrush, QPen
from PyQt5.QtCore import Qt
class Window(QMainWindow):
def __init__(self):
super().__init__()
self.title = "Main Window"
self.right= 200
self.left= 200
self.width = 500
self.height = 500
self.Window()
def Window(self):
self.setWindowTitle(self.title)
self.setGeometry(self.right, self.left, self.width, self.height)
self.show()
class shape():
def __init__(self,length,position,color):
self.length=length
self.position=position
self.color= random.choice(colors)
class circle(shape):
def paintEvent(self, event):
painter = QPainter(self)
painter.setPen(QPen(Qt.red, 4 , Qt.SolidLine))
painter.drawEllipse(20, 20, 200, 200)
class rectangle(shape):
def paintEvent(self, event):
painter = QPainter(self)
painter.setPen(QPen(Qt.yellow, 7, Qt.DotLine))
painter.drawRect(10, 20, 100, 200)
class ellipse(shape):
def paintEvent(self, event):
painter = QPainter(self)
painter.setPen(QPen(Qt.black, 4, Qt.SolidLine))
painter.setBrush(QBrush(Qt.black, Qt.SolidPattern))
painter.drawEllipse(20, 20, 200, 100)
class triangle(shape):
def paintEvent(self, event):
painter = QPainter()
path = QPainterPath()
painter.begin(self)
painter.setRenderHint(QPainter.Antialiasing)
painter.setPen(QtCore.Qt.red)
path.lineTo(180, 300)
path.lineTo(200, 100)
path.lineTo(10, 50)
painter.drawPath(path)
class square(shape):
def paintEvent(self, event):
painter = QPainter()
path = QPainterPath()
painter.begin(self)
painter.setRenderHint(QPainter.Antialiasing)
painter.setPen(QtCore.Qt.red)
path.lineTo(20, 12)
path.lineTo(20, 28)
path.lineTo(36, 28)
path.lineTo(36,12)
path.lineTo(20,12)
painter.drawPath(path)
App = QApplication(sys.argv)
window = Window()
sys.exit(App.exec())
【问题讨论】:
标签: python pyqt pyqt5 shapes qpainter