Рисование фигур в Pyside2
Привожу код, который рисует точки и прямоугольники.
Фигуры, после отображение, исчезают. Почему фигуры исчезают?
Мне нужно отобразить несколько точек и прямоугольников в окне. Не могу разобраться как их сохранить.
import sys
from PySide2 import QtCore, QtGui, QtWidgets
class MyWidget(QtWidgets.QWidget):
def __init__(self):
super().__init__()
self.setGeometry(30,30,600,400)
self.begin = QtCore.QPoint()
self.end = QtCore.QPoint()
self.show()
def paintEvent(self, event):
qp = QtGui.QPainter(self)
br = QtGui.QBrush(QtGui.QColor("transparent"))
qp.setBrush(br)
qp.drawRect(QtCore.QRect(self.begin, self.end))
qp.end()
def mousePressEvent(self, event):
self.begin = event.pos()
self.end = event.pos()
self.update()
def mouseMoveEvent(self, event):
self.end = event.pos()
self.update()
def mouseReleaseEvent(self, event):
self.begin = event.pos()
self.end = event.pos()
self.update()
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
window = MyWidget()
window.show()
app.aboutToQuit.connect(app.deleteLater)
sys.exit(app.exec_())
Ответы (1 шт):
Автор решения: S. Nick
→ Ссылка
Идея решения такова: когда мышь перемещается, пусть прямоугольник рисуется прямо в окне
(потому что вызов self.update() очистит содержимое окна и удалит неопределенный прямоугольник),
и мы определим его, когда мышь будет отпущена.
Код выглядит следующим образом:
- В функции события отпускания мыши
mouseReleaseEvent()мы создаем объектQPainterс холстомself.pixв качестве устройства рисования, а затем рисуем прямоугольник. В это время мышь была отпущена, и координаты были определены, поэтому может быть только один прямоугольник рисуется на холсте. После освобождения установите переменныеself.beginиself.endв исходные координаты (то есть в значение null). - В функции события
paintEvent()создайте экземпляр объектаQPainterс окном в качестве устройства рисования, а затем вызовите методdrawPixmap()для визуализации холста в окне. - Сначала определите, существуют ли
self.beginиself.end(то есть определите, являются ли координаты обеими (0, 0)). Без этого предложения мы обнаружим, что точка рисуется в верхнем левом углу, когда мы запускаем программу. Затем вызовите методdrawRect(), чтобы нарисовать и удерживать его (здесь непосредственно рисуется в окне).
Измените импорты для PySide2 и попробуйте
import sys
#from PySide2 import QtCore, QtGui, QtWidgets # PySide2
from PyQt5 import QtCore, QtGui, QtWidgets # PyQt5
class MyWidget(QtWidgets.QWidget):
def __init__(self):
super().__init__()
# self.setGeometry(30,30,600,400)
self.resize(600, 400)
self.begin = QtCore.QPoint()
self.end = QtCore.QPoint()
# self.show()
self.pix = QtGui.QPixmap(600, 400) # +
self.pix.fill(QtCore.Qt.white) # +
def paintEvent(self, event):
qp = QtGui.QPainter(self) # 2
qp.drawPixmap(0, 0, self.pix)
br = QtGui.QBrush(QtGui.QColor("transparent"))
qp.setBrush(br)
if self.begin and self.end: # 3
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): # 1
# self.begin = event.pos()
# self.end = event.pos()
# self.update()
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() # ... в значение null
self.update()
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
window = MyWidget()
window.show()
# app.aboutToQuit.connect(app.deleteLater)
sys.exit(app.exec_())
