Рисование кистью - PullRequest
0 голосов
/ 22 сентября 2018

Мне нужна помощь с реализацией кисти на PyQt5. У меня уже есть некоторый код события для мыши:

def mousePressEvent(self, event):
    if event.button() and event.button() == Qt.LeftButton:
        self.lastPoint = event.pos()
        self.scribbling = True

def mouseMoveEvent(self, event):
    if (event.buttons() & Qt.LeftButton) and self.scribbling:
        self.drawLineTo(event.pos())


def mouseReleaseEvent(self, event):
    if event.button() == Qt.LeftButton and self.scribbling:
        self.drawLineTo(event.pos())
        self.scribbling = False

Внутри которого объявлена ​​функция рисования кисти:

def drawLineTo(self, endPoint):
    painter = QPainter(self.image)
    painter.setPen(QPen(self.myPenColor, self.myPenWidth, Qt.SolidLine,
            Qt.RoundCap, Qt.RoundJoin))
    painter.drawLine(self.lastPoint, endPoint)
    self.modified = True

    rad = self.myPenWidth / 2 + 2
    self.update(QRect(self.lastPoint, endPoint).normalized().adjusted(-rad, -rad, +rad, +rad))
    self.lastPoint = QPoint(endPoint)

Но главная проблема в том, что эта функция объявлена ​​в самих событиях.Поэтому рисование идет сразу, и я не могу добавить другие инструменты.Потому что вместе с ними «карандаш» будет постоянно рисоваться.Но мне нужно как-то вытащить оттуда функцию и назначить ее соответствующей кнопке.Чтобы включить только нажав на эту кнопку.Допустим, у меня есть какая-то панель инструментов:

toolbar = self.addToolBar('Инструменты')
toolbar.addAction(self.pen)

Для которой есть действие:

self.pen = QAction(QIcon('Image/pen.png'), 'Pencil', self)
self.pen.triggered.connect(self.      )

Как мне это сделать в «triggered.connect» назначить функцию рисования, ичто он работает только при нажатии кнопки.Может быть, для этого есть некоторые связи, как в tkinter, в сходстве:

def draw_pen(self):
    self.parent.config(cursor="arrow")
    self.parent.unbind("<Button-1>")
    self.parent.unbind("<Motion>")
    self.parent.bind("<ButtonPress-1>", self.button_press)
    self.parent.bind('<B1-Motion>', self.draw_pencil_move)
    self.parent.bind('<ButtonRelease-1>', self.draw_pencil_release)

И, в конце концов, я просто назначил эту функцию кнопке, и все работало нормально

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

PS Я прошу прощения за мой английский, если что-то не так с:

1 Ответ

0 голосов
/ 22 сентября 2018

Попробуйте:

import sys
from PyQt5.QtCore    import *
from PyQt5.QtWidgets import *
from PyQt5.QtGui     import *

class MyScribbling(QMainWindow):

    def __init__(self):
        super().__init__()

        self.penOn = QAction(QIcon('Image/ok.png'), 'Включить рисование', self)
        self.penOn.triggered.connect(self.drawingOn)
        self.penOff = QAction(QIcon('Image/exit.png'), 'ВЫКЛЮЧИТЬ рисование', self)
        self.penOff.triggered.connect(self.drawingOff)
        toolbar = self.addToolBar('Инструменты')
        toolbar.addAction(self.penOn)
        toolbar.addAction(self.penOff)

        self.scribbling = False
        self.myPenColor = Qt.red      # +
        self.myPenWidth = 3           # +

        self.lastPoint = QPoint()
        self.image     = QPixmap("Image/picture.png")
        self.setFixedSize(600, 600)
        self.resize(self.image.width(), self.image.height())
        self.show()

    # +++ 
    def paintEvent(self, event):
        painter = QPainter(self)
        painter.drawPixmap(self.rect(), self.image)

    def mousePressEvent(self, event):
        # if event.button() and event.button() == Qt.LeftButton:    # -
        if (event.button() == Qt.LeftButton) and self.scribbling:   # +
            self.lastPoint = event.pos()
            # self.scribbling = True                                # -

    def mouseMoveEvent(self, event):
        if (event.buttons() & Qt.LeftButton) and self.scribbling:

            # self.drawLineTo(event.pos())                          # -

            # +++
            painter = QPainter(self.image)
            painter.setPen(QPen(self.myPenColor, self.myPenWidth, 
                                Qt.SolidLine, Qt.RoundCap, Qt.RoundJoin))
            painter.drawLine(self.lastPoint, event.pos())
            # self.modified = True                                  # ?
            self.lastPoint = event.pos()
            self.update()

            # ?
            #rad = self.myPenWidth / 2 + 2
            #self.update(QRect(self.lastPoint, event.pos()).normalized().adjusted(-rad, -rad, +rad, +rad))
            #self.lastPoint = QPoint(event.pos())   

    def mouseReleaseEvent(self, event):
        if event.button() == Qt.LeftButton and self.scribbling:
            #self.drawLineTo(event.pos())
            #self.scribbling = False  
            pass

#    Перенес в mouseMoveEvent
#    def drawLineTo(self, endPoint):
#        painter = QPainter(self.image)
#        painter.setPen(QPen(self.myPenColor, self.myPenWidth, Qt.SolidLine, Qt.RoundCap, Qt.RoundJoin))
#        painter.drawLine(self.lastPoint, endPoint)
#        self.modified = True  
#        rad = self.myPenWidth / 2 + 2
#        self.update(QRect(self.lastPoint, endPoint).normalized().adjusted(-rad, -rad, +rad, +rad))
#        self.lastPoint = QPoint(endPoint)        

    # +++    
    def drawingOn(self):
        self.scribbling = True

    # +++    
    def drawingOff(self):
        self.scribbling = False


if __name__ == '__main__':
    app = QApplication(sys.argv)
    mainMenu = MyScribbling()
    sys.exit(app.exec_())        

enter image description here

...