Как нарисовать линию?

Буду очень рад, если сможете помочь

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

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

→ Ссылка