Как сделать так, чтобы программа могла рисовать сразу несколько линий на одном холсте?
Программа рисует линию, при попытке нарисовать вторую, первая исчезает, а должна оставаться. Буду рад, если поможете
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 линии.
