Отображение фигур на изображении в Pyside2

Мне нужно отобразить фигуры (точки, прямоугольники и т.д.)
Вот код, который это делает. Это запуск отдельного приложения для рисования.

import sys

from PyQt5 import QtCore, QtGui, QtWidgets  # PyQt5


class MyWidget(QtWidgets.QWidget):
def __init__(self):
    super().__init__()
    self.resize(600, 400)
    self.begin = QtCore.QPoint()
    self.end = QtCore.QPoint()
    self.pix = QtGui.QPixmap(600, 400)
    self.pix.fill(QtCore.Qt.white) 

def paintEvent(self, event):
    qp = QtGui.QPainter(self) 
    qp.drawPixmap(0, 0, self.pix)
    br = QtGui.QBrush(QtGui.QColor("transparent"))
    qp.setBrush(br)
    if self.begin and self.end:
        rect = QtCore.QRect(self.begin, self.end)
        qp.drawRect(rect)

def mousePressEvent(self, event):
    if event.button() == QtCore.Qt.LeftButton:
        self.begin = event.pos()
        self.end = self.begin
        self.update()

def mouseMoveEvent(self, event):
    if event.buttons() == QtCore.Qt.LeftButton:
        self.end = event.pos()
        self.update()

def mouseReleaseEvent(self, event):
    if event.button() == QtCore.Qt.LeftButton:
        painter = QtGui.QPainter(self.pix)
        rect = QtCore.QRect(self.begin, self.end)
        painter.drawRect(rect)
        self.begin = self.end = QtCore.QPoint()
        self.update()


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    window = MyWidget()
    window.show()
    sys.exit(app.exec_())

И есть отдельное приложение, в котором эти функции надо применять.
Замысел в том, что выставляется флаг, что нужно отобразить (по кнопке например). Флаг "точка" - рисует точку, флаг "прямоугольник" - рисует прямоугольник.

Привожу код функции, где я хочу вызвать "рисовалку".

    def process_img(self,event):
    num = self.ui.slider_sec_img.value()
    x = event.pos().x()
    y = event.pos().y()
    if num==0:
        pixmap_painter = QtGui.QPainter(self.ui.label.pixmap())
        pixmap_painter.drawPixmap(0, 0, self.ui.label.pixmap())
        if event.button() == QtCore.Qt.LeftButton:
            begin = event.pos()
            end = begin
            p = QtCore.QPoint(begin)
            pixmap_painter.setPen(Qt.red)
            pixmap_painter.drawPoint(p)
            self.ui.label.update()

Сейчас в этой функции только отображение точки. Без всяких флагов. Точка отображается нормально. Но вот как правильно написать код для отображения прямоугольника, я никак не допру.
Помогите, пожалуйста. Я новичок в PyQt, PySide :)


Ответы (1 шт):

Автор решения: S. Nick

Ну большое, так большое. Тогда попробуйте так:

import sys
from PyQt5.QtGui import QPainter, QPen, QImage, QColor 
from PyQt5.QtWidgets import QMainWindow, QApplication, QFileDialog, QAction
from PyQt5.QtCore import Qt, QRectF, QPointF


class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        mainMenu = self.menuBar()
        instmenu = mainMenu.addMenu("Инстументы")
        file = mainMenu.addMenu("Файл")

        brush = QAction("Кисть", self)
        instmenu.addAction(brush)
        brush.triggered.connect(self.setBrush)
        rect = QAction("Прямоугольник", self)
        instmenu.addAction(rect)
        rect.triggered.connect(self.setRectangle)
        photo = QAction("Вставить фото", self)
        file.addAction(photo)
        photo.triggered.connect(self.getImage)

        self.image = QImage(self.size(), QImage.Format_ARGB32)
        self.image.fill(Qt.transparent)

        self.instrument = 'brush'
        self.start_pos = QPointF()
        self.end_pos = QPointF()
        self.brush_points = []

        self.image = QImage(self.size(), QImage.Format_ARGB32)
        self.image.fill(Qt.transparent)

    def getImage(self):
        filename, _ = QFileDialog.getOpenFileName(
            self, "", "",
            "Images(*.png *.jpg *.jpeg);;PNG(*.png);;JPEG(*.jpg *.jpeg);;All Files(*.*)"
        )
        if not filename:
            return
        self.image.load(filename)

    def draw(self, canvas):
        painter = QPainter(canvas)
        painter.setPen(QPen(QColor(0xfb743e), 5, Qt.SolidLine))
        if self.instrument == 'brush':                                                  # !!!
            for i in self.brush_points:
                painter.drawPoint(i)
        elif self.instrument == 'rectangle':                                            # !!!
            painter.setPen(QPen(QColor(0x91091e), 7, Qt.DashLine))
            painter.drawRect(QRectF(self.start_pos, self.end_pos))

    def paintEvent(self, event):
        painter = QPainter(self)
        painter.drawImage(self.image.rect(), self.image)
        self.draw(self)

    def mousePressEvent(self, event):
        self.start_pos = event.pos()
        self.brush_points.clear()

    def mouseMoveEvent(self, event):
        if event.buttons() & Qt.LeftButton:
            self.end_pos = event.pos()
            self.brush_points.append(self.end_pos)
            self.update()

    def mouseReleaseEvent(self, event):
        self.end_pos = event.pos()
        self.brush_points.append(self.end_pos)
        self.draw(self.image)
        self.update()

    def setBrush(self):
        self.instrument = 'brush'

    def setRectangle(self):
        self.instrument = 'rectangle'


if __name__ == '__main__':
    app = QApplication(sys.argv)
    w = MainWindow()
    w.resize(600, 600)
    w.show()
    sys.exit(app.exec_())

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

→ Ссылка