Python PyQt5:使用事件绘制多个矩形

Python PyQt5:使用事件绘制多个矩形,python,pyqt,pyqt5,Python,Pyqt,Pyqt5,我正在使用PyQt5创建一个桌面应用程序,用户可以在其中绘制矩形 用户应该能够通过第一次鼠标单击选择矩形的左上角,通过第二次鼠标单击选择右下角。该位置应显示一个矩形,周长定义良好。我创建了一个应用程序,但在绘制另一个矩形时遇到了一个问题,之前的矩形消失了。我不能画多个矩形 请查找以下代码以供参考 如果要绘制n个矩形,则必须通过QRect将该信息保存在列表中。另一方面,选择2个点并不意味着QRect有效,例如,如果第一个点位于右侧,则第二个点将不会创建有效的矩形,因此必须对矩形进行规格化。考虑到

我正在使用PyQt5创建一个桌面应用程序,用户可以在其中绘制矩形

用户应该能够通过第一次鼠标单击选择矩形的左上角,通过第二次鼠标单击选择右下角。该位置应显示一个矩形,周长定义良好。我创建了一个应用程序,但在绘制另一个矩形时遇到了一个问题,之前的矩形消失了。我不能画多个矩形

请查找以下代码以供参考



如果要绘制n个矩形,则必须通过QRect将该信息保存在列表中。另一方面,选择2个点并不意味着QRect有效,例如,如果第一个点位于右侧,则第二个点将不会创建有效的矩形,因此必须对矩形进行规格化。考虑到上述情况,解决方案是:

导入系统 从PyQt5.QtCore导入Qt、QPoint、QRect 从PyQt5.QtGui导入QPainter、QPen、QBrush、QIcon 从PyQt5.QtWidgets导入QApplication,QWidget 类窗口(QWidget): 定义初始化(自): super()。\uuuu init\uuuuu() 自设置几何体(150250500500) self.setWindowTitle(“Ammyyy”) self.setWindowIcon(QIcon(“a.jpeg”)) self.begin=QPoint() self.end=QPoint() self.rectangles=[] def paintEvent(自身,事件): qp=QPainter(自行) qp.设置笔(QPen(Qt.黑色,6,Qt.实线)) 对于self.rectangles中的矩形: qp.drawRect(矩形) 如果不是self.begin.isNull()而不是self.end.isNull(): qp.drawRect(QRect(self.begin,self.end).normalized()) def鼠标压力事件(自身、事件): self.begin=self.end=event.pos() self.update() super().mousePressEvent(事件) def mouseMoveEvent(自身、事件): self.end=event.pos() self.update() super().mouseMoveEvent(事件) def mouseReleaseEvent(自身,事件): r=QRect(self.begin,self.end).normalized() self.rectangles.append(r) self.begin=self.end=QPoint() self.update() super().mouseReleaseEvent(事件) 如果名称=“\uuuuu main\uuuuuuuu”: app=QApplication(sys.argv) win=窗口() win.show() sys.exit(app.exec_())
import sys
from PyQt5.QtWidgets import *
from PyQt5 import QtGui, QtCore
from PyQt5.QtGui import QPainter, QPen, QBrush
from PyQt5.QtCore import Qt

class Windo(QWidget):
    def __init__(self):
        super().__init__()

        self.setGeometry(150,250,500,500)
        self.setWindowTitle("Ammyyy")
        self.setWindowIcon(QtGui.QIcon('a.jpeg'))

        self.begin = QtCore.QPoint()
        self.end = QtCore.QPoint()

        self.show()

    def paintEvent(self,event):
        qp = QPainter(self)
        qp.begin(self)
        qp.setPen(QPen(Qt.black, 6, Qt.SolidLine))
        qp.drawRect(QtCore.QRect(self.begin, self.end))
        qp.end()

    def mousePressEvent(self, event):
        self.begin = event.pos()
        self.end = event.pos()

    def mouseMoveEvent(self, event):
        self.end = event.pos()
        self.update()

    def mouseReleaseEvent(self, event):
        self.begin = event.pos()
        self.end = event.pos()

app = QApplication(sys.argv)
win = Windo()
sys.exit(app.exec_())