Отображение фигур на изображении в 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 шт):
Ну большое, так большое. Тогда попробуйте так:
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_())
