Как нарисовать линию?
Буду очень рад, если сможете помочь
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.koordinata = QPoint()
self.setGeometry(300, 300, 700, 700)
self.image = QImage(self.size(), QImage.Format_RGB32)
self.image.fill(Qt.white)
def paintEvent(self, event):
painter = QPainter(self)
painter.drawImage(self.rect(), self.image, self.image.rect())
def mousePressEvent(self, event):
self.koordinata = event.pos()
self.update()
def mouseMoveEvent(self, event):
self.update()
def mouseReleaseEvent(self, event):
painter = QPainter(self.image)
painter.setPen(QPen(Qt.black, 8, Qt.SolidLine))
painter.drawLine(QLineF(self.koordinata, event.pos()))
self.update()
if __name__ == '__main__':
app = QApplication(sys.argv)
wnd = Window()
wnd.show()
sys.exit(app.exec())
Ответы (1 шт):
Автор решения: S. Nick
→ Ссылка
Как вариант:
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.koordinata = QPoint()
self.setGeometry(300, 300, 700, 700)
self.image = QImage(self.size(), QImage.Format_RGB32)
self.image.fill(Qt.white)
self.drawing = False # +++
def paintEvent(self, event):
painter = QPainter(self)
painter.drawImage(self.rect(), self.image, self.image.rect())
if not self.drawing: # +++
self.image.fill(Qt.white) # +++
painter.drawImage(self.rect(), self.image, self.image.rect()) # +++
def mousePressEvent(self, event):
if event.button() == Qt.LeftButton: # +++ ...
self.drawing = True # +++
self.koordinata = event.pos()
def mouseMoveEvent(self, event): # !!!
if event.buttons() and Qt.LeftButton and self.drawing: # +++ !!!
painter = QPainter(self.image)
painter.setPen(QPen(Qt.red, 3, Qt.SolidLine))
painter.drawLine(self.koordinata, event.pos())
self.koordinata = event.pos()
self.update() # update
def mouseReleaseEvent(self, event):
if event.button() == Qt.LeftButton:
self.drawing = False # +++
self.update() # update
if __name__ == '__main__':
app = QApplication(sys.argv)
wnd = Window()
wnd.show()
sys.exit(app.exec_())
Update
... но я попросил сделать именно инструмент линия (прямая), как в paint, при написании своего другого кода у меня возникали проблемы с тем, как сделать так чтобы при зажатой лкм рисовалась линия, но не наносилась на полотно, а при отпускании лкм, она окончательно рисовалась
я уже не уверен, что понимаю, что вы хотите сделать, но попробуйте так:
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.koordinata = QPoint()
self.setGeometry(300, 300, 700, 700)
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.koordinata = event.pos()
self.start = event.pos() # +++
def mouseMoveEvent(self, event): # +++
if event.buttons() and Qt.LeftButton: # +++
painter = QPainter(self.image)
painter.setPen(QPen(Qt.red, 3, Qt.SolidLine))
painter.drawLine(self.koordinata, event.pos())
self.koordinata = event.pos()
self.update() # update
def mouseReleaseEvent(self, event):
if event.button() == Qt.LeftButton:
self.image.fill(Qt.white) # +++
painter = QPainter(self.image) # +++
painter.setPen(QPen(Qt.red, 3, Qt.SolidLine)) # +++
painter.drawLine(self.start, event.pos()) # +++
self.update() # update
if __name__ == '__main__':
app = QApplication(sys.argv)
wnd = Window()
wnd.show()
sys.exit(app.exec_())
Update 2
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, 700)
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.red, 3, Qt.SolidLine))
painter.drawLine(self.start, event.pos()) # !!! start
self.update() # update
if __name__ == '__main__':
app = QApplication(sys.argv)
wnd = Window()
wnd.show()
sys.exit(app.exec_())


