Как сделать так, чтобы программа могла рисовать сразу несколько линий на одном холсте?

Программа рисует линию, при попытке нарисовать вторую, первая исчезает, а должна оставаться. Буду рад, если поможете

import sys
from PyQt5.QtGui import QPainter, QPen, QImage
from PyQt5.QtWidgets import QMainWindow, QApplication
from PyQt5.QtCore import Qt, QPoint, QLineF


class Window(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setGeometry(300, 300, 700, 500)
        self.image = QImage(self.size(), QImage.Format_RGB32)
        self.image.fill(Qt.white)
        self.start = QPoint()

    def paintEvent(self, event):
        painter = QPainter(self)
        painter.drawImage(self.rect(), self.image, self.image.rect())

    def mousePressEvent(self, event):
        if event.button() == Qt.LeftButton:
            self.start = event.pos()

    def mouseMoveEvent(self, event):
        if event.buttons() and Qt.LeftButton:
            self.image.fill(Qt.white)
            painter = QPainter(self.image)
            painter.setPen(QPen(Qt.black, 5, Qt.SolidLine))
            painter.drawLine(self.start, event.pos())
            self.update()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    wnd = Window()
    wnd.show()
    sys.exit(app.exec_())

Ответы (2 шт):

Автор решения: S. Nick

Если вы хотите нарисовать n-линий, вы должны сохранить эту информацию в списке.

import sys
from PyQt5.QtGui import QPainter, QPen, QImage
from PyQt5.QtWidgets import QMainWindow, QApplication
from PyQt5.QtCore import Qt, QPoint, QLineF


class Window(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setGeometry(300, 300, 700, 500)
        self.image = QImage(self.size(), QImage.Format_RGB32)
        self.image.fill(Qt.white)
        self.start = QPoint()
        
        self.lines = []                                                  # +++

    def paintEvent(self, event):
        painter = QPainter(self)
        painter.drawImage(self.rect(), self.image, self.image.rect())
        
        painter.setPen(QPen(Qt.black, 5, Qt.SolidLine))                  # +++
        for i in self.lines:                                             # +++
            painter.drawLine(*i)                                         # +++

    def mousePressEvent(self, event):
        if event.button() == Qt.LeftButton:
            self.start = event.pos()

    def mouseMoveEvent(self, event):
        if event.buttons() == Qt.LeftButton:
            self.image.fill(Qt.white)
            painter = QPainter(self.image)
            painter.setPen(QPen(Qt.black, 5, Qt.SolidLine))
            painter.drawLine(self.start, event.pos())
            self.update()
            
    def mouseReleaseEvent(self, event):                                     # +++
        self.lines.append([self.start, event.pos()])                        # +++
        self.update()                                                       # +++


if __name__ == '__main__':
    app = QApplication(sys.argv)
    wnd = Window()
    wnd.show()
    sys.exit(app.exec_())

введите сюда описание изображения

→ Ссылка
Автор решения: TheCrazyFruit

Попробуй использовать цикл for, в него засунь код для отображения нужной тебе линии. Создаёшь например 2 цикла for, пихаешь в один код для 1 линии, а во второй цикл - код для 2 линии.

→ Ссылка