python pyqt pyqt5 qpainter qmouseevent

python - Cómo dibujar un rectángulo y ajustar su forma arrastrando y soltando en PyQt5



qpainter qmouseevent (1)

Estoy intentando dibujar un rectángulo en la GUI creada por PyQt5 arrastrando y soltando. Logré hacer eso, pero el rectángulo se dibuja cuando se suelta la tecla izquierda del mouse.

Lo que quiero hacer es como este enlace :

  • Cuando se presiona el botón izquierdo del mouse, comience a dibujar el rectángulo.
  • Mientras arrastra, ajuste la forma del rectángulo con el movimiento del mouse.
  • Cuando se suelta el botón izquierdo del mouse, determine la forma del rectángulo.

¿Cómo puedo implementar esto? Gracias por adelantado.

Aquí está mi código.

# -*- coding: utf-8 -*- import sys from PyQt5 import QtWidgets, QtCore from PyQt5.QtGui import QPainter class MyWidget(QtWidgets.QWidget): def __init__(self): super().__init__() self.setGeometry(30,30,600,400) self.pos1 = [0,0] self.pos2 = [0,0] self.show() def paintEvent(self, event): width = self.pos2[0]-self.pos1[0] height = self.pos2[1] - self.pos1[1] qp = QPainter() qp.begin(self) qp.drawRect(self.pos1[0], self.pos1[1], width, height) qp.end() def mousePressEvent(self, event): self.pos1[0], self.pos1[1] = event.pos().x(), event.pos().y() print("clicked") def mouseReleaseEvent(self, event): self.pos2[0], self.pos2[1] = event.pos().x(), event.pos().y() print("released") self.update() if __name__ == ''__main__'': app = QtWidgets.QApplication(sys.argv) window = MyWidget() window.show() app.aboutToQuit.connect(app.deleteLater) sys.exit(app.exec_())


No tiene que usar la función mouseReleaseEvent , sino la función mouseMoveEvent que se llama cada vez que se mueve el mouse, y he modificado el código para hacerlo más simple.

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(100, 10, 10, 40)) qp.setBrush(br) qp.drawRect(QtCore.QRect(self.begin, self.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()