Сбой при попытке рисовать на загруженном изображении QPixMap - PullRequest
0 голосов
/ 30 января 2019

Я работаю над проектом, который в основном Paint.Я реализовал функцию открытия файла, поэтому, когда я открываю файл, он загружается в QPixmap.

Проблема в : когда я пытаюсь нарисовать на успешно загруженном QPixmap, мое приложение вылетает (без ошибок или чего-то другого, он просто закрывается).Я предоставлю свой код для рисования и открытия файла.Я думаю, что остальные (пользовательский интерфейс и т. Д.) В этом случае не нужны.

Рисунок:

class Canvas(QLabel):
    def __init__(self, parent=None):
        super().__init__(parent)
        p = self.palette()
        p.setColor(self.backgroundRole(), Qt.white)
        self.setAutoFillBackground(True)
        self.setPalette(p)
        self.myPixmap = QPixmap(600, 600)
        self.painter = QPainter(self.myPixmap)
        self.pen = QPen()
        self.painter.setPen(self.pen)
        self.painter.fillRect(0, 0, 600, 600, Qt.white)
        self.setPixmap(self.myPixmap)
        self.last = None    

    def mouseMoveEvent(self, event):
        if self.last:
            self.painter.setPen(self.pen)
            self.painter.drawLine(self.last, event.pos())

            self.last = event.pos()
            self.setPixmap(self.myPixmap)
            self.update()

    def mousePressEvent(self, event):
        self.last = event.pos()

    def mouseReleaseEvent(self, event):
        self.last = None

Открытие файла:

def openFile(self):
    openFile_file = QFileDialog.getOpenFileName(None, 'Open File:', '', 'Images (*.png *.bmp *.jpg)')
    openFile_ok = self.canvas.myPixmap.load(openFile_file[0])
    self.canvas.setPixmap(self.canvas.myPixmap)
    self.canvas.update()
    print('open', openFile_ok)

1 Ответ

0 голосов
/ 30 января 2019

Двумя основными проблемами были: 1) не завершить рисование, выполненное в процессе строительства, и 2) не выполнить сброс художника после загрузки нового изображения.

import sys
from PyQt5.QtGui import QPixmap, QPainter, QPen
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QApplication, QLabel, QFileDialog

class Canvas(QLabel):
    def __init__(self, parent=None):
        super().__init__(parent)
        p = self.palette()
        p.setColor(self.backgroundRole(), Qt.white)
        self.setAutoFillBackground(True)
        self.setPalette(p)
        self.myPixmap = QPixmap(600, 600)
        self.painter = QPainter(self.myPixmap)
        self.pen = QPen()
        self.painter.setPen(self.pen)
        self.painter.fillRect(0, 0, 600, 600, Qt.white)
        self.painter.end()  # Need to end the painting here
        self.setPixmap(self.myPixmap)

        self.last = None
        self.image_loaded = False

    def mouseMoveEvent(self, event):
        if self.last:
            self.painter.setPen(self.pen)
            self.painter.drawLine(self.last, event.pos())

            self.last = event.pos()
            self.setPixmap(self.myPixmap)
            self.update()

    def mousePressEvent(self, event):
        if not self.image_loaded:
            self.openFile()
            self.image_loaded = True
        self.last = event.pos()

    def mouseReleaseEvent(self, event):
        self.last = None

    def openFile(self):
        openFile_file = QFileDialog.getOpenFileName(None, 'Open File:', '', 'Images (*.png *.bmp *.jpg)')
        openFile_ok = self.myPixmap.load(openFile_file[0])
        self.setPixmap(self.myPixmap)

        self.painter = QPainter(self.myPixmap)  # Need to reset the painter...there may be another method without creating a new painter
        self.painter.setPen(self.pen)

        self.update()
        print('open', openFile_ok)

app = QApplication(sys.argv)
label = Canvas()
label.show()
sys.exit(app.exec_())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...