Рисование фигур с использованием PYQT5 - PullRequest
0 голосов
/ 02 ноября 2019
  1. Для начала определите базовый класс Shape, в котором хранится длина фигуры, ее положение и (случайным образом сгенерированный) цвет. Оттуда вы можете унаследовать эти основные свойства и дополнительно указать дополнительные фигуры. Как минимум, ваша программа должна поддерживать квадраты, прямоугольники, треугольники, круги и эллипсы. Каждая форма должна определять свой собственный класс в иерархии наследования, основанной на Shape. Напомним, что наследование часто охватывает несколько уровней, поэтому рассмотрите и реализуйте соответствующую схему наследования. Классы, которые определяют различные формы, должны дополнительно определять класс Shape, добавляя дополнительные необходимые атрибуты, соответствующим образом вызывая родительские конструкторы во время инициализации, и включая метод для рисования формы с использованием экземпляра QPainter, предоставленного в качестве параметра. Обратите внимание, что классы фигур полностью инкапсулируют концепции форм, включая графический графический чертеж. Предоставляя уже используемый экземпляр QPainter для методов рисования фигур, <- код, который я предоставил, должен делать то, о чем просит вопрос выше, но я не уверен, что я делаю это правильно и хочу проверитьесли мой текущий код делает это. </p>

  2. Когда пользователь щелкает где-то в окне (на это указывает вызов mousePressEvent), создайте произвольно новый объект Shape, который будет расположен в координатах щелчкаи добавьте эту фигуру в список элементов для рисования, который должен быть атрибутом вашего класса. Конструктор объекта Shape (в сотрудничестве с его родительскими конструкторами) должен установить все его атрибуты, включая координаты, цвет и размер. Не стесняйтесь применять разумные ограничения для формы размеров. Каждый раз, когда окно рисуется (потому что что-то вызвало вызов paintEvent), каждая из фигур, созданных до сих пор, должна быть нарисована. Поскольку они находятся в списке (см. Ниже), вы можете перебирать их с помощью цикла и рисовать каждую фигуру. Прелесть полиморфизма в том, что вы можете обращаться со всеми ними как с базовыми фигурами и просить их рисовать сами, потому что каждый из них реализует метод рисования, который принимает экземпляр QPainter (возможно, один из paintEvent в ShapeDrawer.py) в качестве параметра. Обратите внимание, что вы, должно быть, уже активировали объект Painter, вызвав его метод begin, прежде чем передать его в метод рисования фигуры. <- Я понятия не имею, как завершить номер 2 с моим текущим кодом, и был бы очень признателен, если бы кто-то мог помочь мне сномер два, потому что меня смущают часть щелчков мышью и два в целом. </p>

В целом, я сделал номер один с предоставленным кодом и хочу убедиться, что он правильный и не имеетПонять, как сделать номер два и нужна помощь.

Код, который я предоставил, - это то, что я пробовал.

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())

1 Ответ

1 голос
/ 04 ноября 2019

В вопросе говорится, что фигуры должны рисовать себя, используя объект QPainter, который предоставляется в качестве аргумента. В вашей реализации вы создаете отдельные QPainter экземпляры в paintEvent. Вместо перегрузки paintEvent вы можете реализовать метод рисования в каждом из подклассов Shape, который принимает объект QPainter в качестве аргумента для рисования фигуры. В методе 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()

и т. Д. И в Window:

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())
...